用蓝牙实时模仿人手的机械手
弯曲传感器通过蓝牙HC-05实时模仿人手时,接收的数据跟发送的数据不同,有哪位大神帮忙看看要怎么处理?发送数据用Arduino UNO板代码如下
int a,b,c,d,e;
void setup() {
Serial.begin(38400);
}
//本段代码实现功能是读取弯曲传感器数值。
void loop() {
a=analogRead(A0); //读取A0端口的传感器的数值,并赋值为a。
b=analogRead(A1); //以下均同上。
c=analogRead(A5);
d=analogRead(A3);
e=analogRead(A4);
//本段代码实现功能是由发送端向接收端发送数值的代码。
Serial.println('<');
Serial.println(a);
Serial.println(b);
Serial.println(c);
Serial.println(d);
Serial.println(e);
}
接收数据用arduino nano板
代码如下
#include<Servo.h>
Servo s1,s2,s3,s4,s5; //舵机
unsigned int val;
int a,b,c,d,e;
int val1,val2,val3,val4,val5;
char ch;
void setup() {
Serial.begin(38400);
s1.attach(6); //舵机角度的数值函数
s2.attach(7);
s3.attach(8);
s4.attach(9);
s5.attach(10);
}
void loop() {
if(Serial.available()>0)
{
ch=Serial.read();
if(ch=='<')
{
a=Serial.parseInt();
b=Serial.parseInt();
c=Serial.parseInt();
d=Serial.parseInt();
e=Serial.parseInt();
}
}
Serial.println('<');
Serial.println(a);
Serial.println(b);
Serial.println(c);
Serial.println(d);
Serial.println(e);
val1 = analogRead(a);
val1= map(val1,1024,0, 0, 130);
s1.write(val1);
val2 = analogRead(b);
val2= map(val2, 1024, 0, 0, 130);
s2.write(val2);
val3 = analogRead(c);
val3= map(val3, 1024, 0, 0, 130);
s3.write(val3);
val4 = analogRead(d);
val4= map(val4, 1024, 0, 0, 130);
s4.write(val4);
val5 = analogRead(e);
val5= map(val5, 0, 1024 , 0, 120);
s5.write(val5);
delay(10);
}
把发出和收到的内容打印出来啊,不然谁知道你说什么不同 本帖最后由 sanri14 于 2018-8-9 20:07 编辑
spirn 发表于 2018-8-9 15:45
把发出和收到的内容打印出来啊,不然谁知道你说什么不同
发送的数据 接收的数据
两个数据不同。
蓝牙波特率是:38400,0,0
每个数字之间都加个分隔符 spirn 发表于 2018-8-9 20:17
每个数字之间都加个分隔符
代码怎么写??数据是读取模拟端口电阻变化得到。我是用弯曲传感器实时控制机械手,弯曲度不同,电阻不同,输入的数据就会变化。 sanri14 发表于 2018-8-9 21:27
代码怎么写??数据是读取模拟端口电阻变化得到。我是用弯曲传感器实时控制机械手,弯曲度不同,电阻不 ...
Serial.println('<');
Serial.println(a);
Serial.println('<');
Serial.println(b);
Serial.println('<');
Serial.println(c);
Serial.println('<');
Serial.println(d);
Serial.println('<');
Serial.println(e);
Serial.println('>');
怎么读你自己改代码吧 spirn 发表于 2018-8-9 21:33
Serial.println('
你好,按你的方法试过了,还是不行,数据还是经常会不一样。
波特率调小后会好一点,但是实时数据还是不能始终保持一致。我查过很多资料,知道是由于传输速度快,导致数据不完整,需要将数据打包才能完整,但是不知道如何打包数据,不知道代码该如何写。
我是新手,刚接触不久,很多基本的都不懂,还望详细指导指导,谢谢 sanri14 发表于 2018-8-9 22:49
你好,按你的方法试过了,还是不行,数据还是经常会不一样。
波特率调小后会好一点,但是实时数据还是不 ...
你不要用parseInt, 用Serial.readString()看看读出来的数据和写入是否一样吧。
还有可以试试两边都用 Serial.begin(9600,SERIAL_8E1)初始化。 spirn 发表于 2018-8-10 09:53
你不要用parseInt, 用Serial.readString()看看读出来的数据和写入是否一样吧。
还有可以试试两边都用...
用Serial.readString(),编译通不过,显示 error: cannot convert 'String' to 'int' in assignment,还需要改其他地方吗?用Serial.read()读取的是ASCII码,所以才用parseInt。
用Serial.begin(9600,SERIAL_8E1)也不行,接收到的是乱码 Serial.begin(9600,SERIAL_8E1) 是增加校验,当然两边都要加,这样可以保证收到的内容没错。
parseInt里面隐藏了太多细节,出错的时候不好估计原因,所以你应该用readString/read之类的办法来取到原始接收到的数据来看是否正确接收了。
readString返回的内容是字符串,你赋值到整数肯定是出错,这样说来代码也不是你自己写的吧,连变量类型都没搞懂,建议先学一下语法,否则你不可能自己进行程序调试的。 spirn 发表于 2018-8-10 11:37
Serial.begin(9600,SERIAL_8E1) 是增加校验,当然两边都要加,这样可以保证收到的内容没错。
parseInt里 ...
是,我是初学者,之前没有编程基础。这段代码是修改别人的,不是我自己写的。前面的变量abcde,还有val1那些也定义为String,但是还是不能通过。能否帮忙修改一下完整的代码?谢谢
页:
[1]