罹凝寒冰 发表于 2013-7-30 17:06:27

C#界面控制arduino舵机。求教,

arduino程序如下,我试过,用arduino的监视器可以收到C# 界面发送的L,D,R,U。但是舵机不动  什么原因?
#include <Servo.h>
Servo myservox;//创建一个水平舵机控制对象
Servo myservoy;   //竖直舵机
int bc=1;
int posx=0;
int posy=0;
char c;

void setup()
{
myservox.attach(9); //   shuiping 9jiao
myservoy.attach(10); // 该舵机由arduino第10脚控制
Serial.begin(9600);
myservox.write(0);
myservoy.write(0);
}

void loop()

{
if(Serial.available())
   c= Serial.read();
Serial.print(c);
switch(c)
{
      case "L":   //left
      while(posx>0&&posx<=180)
      {
      posx=posx-1;
      myservox.write(posx);
      delay(posx);
      break ;
      }
   case 'R':   //right
   while(posx>=0&&posx<180)
   {
       posx=posx+1;
       myservoy.write(posx);
       delay(posx);
       break;
   }
    case 'U': //up
    while(posy>=0&&posy<90)
    {
       posy=posy+1;
       myservoy.write(posy);
       delay(posy);
       break;
    }
    case 'D':   //down
    while(posy>0&&posy<=90)
    {
       posy=posy-1;
       myservoy.write(posy);
       delay(posy);
       break;
    }
}
delay(100);
   

}

   

qptimus 发表于 2013-8-1 11:22:17

c= Serial.read();

有问题,Serial.read()读出来的是string,而c是char,switch没有执行

罹凝寒冰 发表于 2013-8-1 15:04:13

qptimus 发表于 2013-8-1 11:22 static/image/common/back.gif
c= Serial.read();

有问题,Serial.read()读出来的是string,而c是char,switch没有执行

可是我发的是字母 LR D U就发一个字母啊。我把char c改成String C。编译都过不去。

罹凝寒冰 发表于 2013-8-1 15:47:43

罹凝寒冰 发表于 2013-8-1 15:04 static/image/common/back.gif
可是我发的是字母 LR D U就发一个字母啊。我把char c改成String C。编译都过不去。

我把cha c改成 int c。把 LRDU 这四个字母改成了1234.用串口调试助手给板子发1234. 板子都没动静。。擦擦擦

qptimus 发表于 2013-8-1 16:33:37

罹凝寒冰 发表于 2013-8-1 15:47 static/image/common/back.gif
我把cha c改成 int c。把 LRDU 这四个字母改成了1234.用串口调试助手给板子发1234. 板子都 ...

看看你串口发送端是不是自动加了回车或者换行符,建议用16进制形式仔细查卡自己发送和接受的内容

qptimus 发表于 2013-8-1 16:34:42

罹凝寒冰 发表于 2013-8-1 15:47 static/image/common/back.gif
我把cha c改成 int c。把 LRDU 这四个字母改成了1234.用串口调试助手给板子发1234. 板子都 ...

string类型数据在末尾都会有\0结束符,所以即便是你只有一个字符,长度也是2

罹凝寒冰 发表于 2013-8-1 16:59:13

qptimus 发表于 2013-8-1 16:33 static/image/common/back.gif
看看你串口发送端是不是自动加了回车或者换行符,建议用16进制形式仔细查卡自己发送和接受的内容

我用串口调试助手发的 应该不加回车或者换行的  十六进制的我也试过  发送十六进制的 arduino串口收到的也是一样的十六进制数

罹凝寒冰 发表于 2013-8-1 17:03:01

qptimus 发表于 2013-8-1 16:34 static/image/common/back.gif
string类型数据在末尾都会有\0结束符,所以即便是你只有一个字符,长度也是2

用char 应该读取的是第一个字符的  按理说我不管发送的是LRDU 还是int 才,1 2 3 4 。应该都可以读到的啊

罹凝寒冰 发表于 2013-8-5 16:57:15

qptimus 发表于 2013-8-1 16:34 static/image/common/back.gif
string类型数据在末尾都会有\0结束符,所以即便是你只有一个字符,长度也是2

private void button1_Click(object sender, EventArgs e)
      {
            if (serialPort1.IsOpen)
               serialPort1.Write("U"); //up
                byte[] bytesToSend = new byte ;
               serialPort1.Write(bytesToSend, 0, 1);

       }   这个是我C# 界面发送字符U的语句 你看有错误吗?

qptimus 发表于 2013-8-5 18:18:25

罹凝寒冰 发表于 2013-8-5 16:57 static/image/common/back.gif
private void button1_Click(object sender, EventArgs e)
      {
            if (serialPort1.IsO ...

你发送的是字符串,不是字符

罹凝寒冰 发表于 2013-8-6 08:14:11

qptimus 发表于 2013-8-5 18:18 static/image/common/back.gif
你发送的是字符串,不是字符

那我接收用int数组还是 char数组接收呢、?

wyd1520 发表于 2013-8-7 15:11:14

罹凝寒冰 发表于 2013-8-6 08:14 static/image/common/back.gif
那我接收用int数组还是 char数组接收呢、?

   serialPort1.Write("U"); //up
               byte[] bytesToSend = new byte ;
                  serialPort1.Write(bytesToSend, 0, 1);
这里写的有问题
你是应改成

   
               byte[] bytesToSend = new byte ;
               bytesToSend =(byte)'u';
                  serialPort1.Write(bytesToSend, 0, 1);

罹凝寒冰 发表于 2013-8-7 15:58:22

wyd1520 发表于 2013-8-7 15:11 static/image/common/back.gif
serialPort1.Write("U"); //up
               byte[] bytesToSend = new byte ;
             ...

发送L R D U 字母控制两个舵机 已经实现了把所有的while 判断循环删掉就好了现在要实现串口发送十六进制0x01.0x02.0x03.0x04来控制两个舵机 这个把我难住了。。

wyd1520 发表于 2013-8-8 00:15:06

罹凝寒冰 发表于 2013-8-7 15:58 static/image/common/back.gif
发送L R D U 字母控制两个舵机 已经实现了把所有的while 判断循环删掉就好了现在要实现串口发送十 ...

Arduino接收是一个字符一个字符的接的。你发16进制与发byte是一样的,直接
bytesp=0x01就是了,
然后在Arduion接收就是byte x=seri.Read()
if(x==1)
xxx
除非你要接收整串的,那要写协议比如0x00做为协议头 0xFF作为结束然后自己在Arduino去做判断就是了。
这个很容易的。如果方便把把你的C#的代码发上来,我也来调试,正好我也要作这方面的通迅

罹凝寒冰 发表于 2013-8-8 08:53:54

wyd1520 发表于 2013-8-8 00:15 static/image/common/back.gif
Arduino接收是一个字符一个字符的接的。你发16进制与发byte是一样的,直接
bytesp=0x01就是了,
然后 ...

C#代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
      public Form1()
      {
            InitializeComponent();
         
      }

      private void button5_Click(object sender, EventArgs e)
      {
            if(button5.Text == "打开串口")
            {
                button5.Text = "关闭串口";
                serialPort1.Open();
            }
            else
            {
                button5.Text = "打开串口";
                serialPort1.Close();
            }

      }

      private void button1_Click(object sender, EventArgs e)
      {
            Byte[] BSendTemp = new Byte; //建立临时字节数组对象
            BSendTemp = 3; //由文本框读入想要发送的数据
            serialPort1.Write(BSendTemp, 0, 1);//发送数据       //up
               
       }

      private void button2_Click(object sender, EventArgs e)
      {
            Byte[] BSendTemp = new Byte; //建立临时字节数组对象
            BSendTemp = 4;//由文本框读入想要发送的数据
            serialPort1.Write(BSendTemp, 0, 1);//发送数据   //down
      }

      private void button3_Click(object sender, EventArgs e)
      {
            Byte[] BSendTemp = new Byte; //建立临时字节数组对象
            BSendTemp = 1;//由文本框读入想要发送的数据
            serialPort1.Write(BSendTemp, 0, 1);//发送数据    //left
      }

      private void button4_Click(object sender, EventArgs e)
      {
            Byte[] BSendTemp = new Byte; //建立临时字节数组对象
            BSendTemp =2;//由文本框读入想要发送的数据
            serialPort1.Write(BSendTemp, 0, 1);//发送数据   
      }

      

    }
}
页: [1] 2
查看完整版本: C#界面控制arduino舵机。求教,