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);
}
c= Serial.read();
有问题,Serial.read()读出来的是string,而c是char,switch没有执行 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:04 static/image/common/back.gif
可是我发的是字母 LR D U就发一个字母啊。我把char c改成String C。编译都过不去。
我把cha c改成 int c。把 LRDU 这四个字母改成了1234.用串口调试助手给板子发1234. 板子都没动静。。擦擦擦 罹凝寒冰 发表于 2013-8-1 15:47 static/image/common/back.gif
我把cha c改成 int c。把 LRDU 这四个字母改成了1234.用串口调试助手给板子发1234. 板子都 ...
看看你串口发送端是不是自动加了回车或者换行符,建议用16进制形式仔细查卡自己发送和接受的内容 罹凝寒冰 发表于 2013-8-1 15:47 static/image/common/back.gif
我把cha c改成 int c。把 LRDU 这四个字母改成了1234.用串口调试助手给板子发1234. 板子都 ...
string类型数据在末尾都会有\0结束符,所以即便是你只有一个字符,长度也是2 qptimus 发表于 2013-8-1 16:33 static/image/common/back.gif
看看你串口发送端是不是自动加了回车或者换行符,建议用16进制形式仔细查卡自己发送和接受的内容
我用串口调试助手发的 应该不加回车或者换行的 十六进制的我也试过 发送十六进制的 arduino串口收到的也是一样的十六进制数 qptimus 发表于 2013-8-1 16:34 static/image/common/back.gif
string类型数据在末尾都会有\0结束符,所以即便是你只有一个字符,长度也是2
用char 应该读取的是第一个字符的 按理说我不管发送的是LRDU 还是int 才,1 2 3 4 。应该都可以读到的啊 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的语句 你看有错误吗? 罹凝寒冰 发表于 2013-8-5 16:57 static/image/common/back.gif
private void button1_Click(object sender, EventArgs e)
{
if (serialPort1.IsO ...
你发送的是字符串,不是字符 qptimus 发表于 2013-8-5 18:18 static/image/common/back.gif
你发送的是字符串,不是字符
那我接收用int数组还是 char数组接收呢、? 罹凝寒冰 发表于 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); 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来控制两个舵机 这个把我难住了。。 罹凝寒冰 发表于 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#的代码发上来,我也来调试,正好我也要作这方面的通迅 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