sanri14 发表于 2018-8-9 15:37:21

用蓝牙实时模仿人手的机械手

弯曲传感器通过蓝牙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);                     

}

spirn 发表于 2018-8-9 15:45:49

把发出和收到的内容打印出来啊,不然谁知道你说什么不同

sanri14 发表于 2018-8-9 20:05:02

本帖最后由 sanri14 于 2018-8-9 20:07 编辑

spirn 发表于 2018-8-9 15:45
把发出和收到的内容打印出来啊,不然谁知道你说什么不同

                  

发送的数据                                 接收的数据

两个数据不同。
蓝牙波特率是:38400,0,0



spirn 发表于 2018-8-9 20:17:35

每个数字之间都加个分隔符

sanri14 发表于 2018-8-9 21:27:16

spirn 发表于 2018-8-9 20:17
每个数字之间都加个分隔符

代码怎么写??数据是读取模拟端口电阻变化得到。我是用弯曲传感器实时控制机械手,弯曲度不同,电阻不同,输入的数据就会变化。

spirn 发表于 2018-8-9 21:33:45

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('>');

怎么读你自己改代码吧

sanri14 发表于 2018-8-9 22:49:20

spirn 发表于 2018-8-9 21:33
Serial.println('

你好,按你的方法试过了,还是不行,数据还是经常会不一样。
波特率调小后会好一点,但是实时数据还是不能始终保持一致。我查过很多资料,知道是由于传输速度快,导致数据不完整,需要将数据打包才能完整,但是不知道如何打包数据,不知道代码该如何写。
我是新手,刚接触不久,很多基本的都不懂,还望详细指导指导,谢谢

spirn 发表于 2018-8-10 09:53:33

sanri14 发表于 2018-8-9 22:49
你好,按你的方法试过了,还是不行,数据还是经常会不一样。
波特率调小后会好一点,但是实时数据还是不 ...

你不要用parseInt, 用Serial.readString()看看读出来的数据和写入是否一样吧。

还有可以试试两边都用 Serial.begin(9600,SERIAL_8E1)初始化。

sanri14 发表于 2018-8-10 11:19:53

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)也不行,接收到的是乱码

spirn 发表于 2018-8-10 11:37:08

Serial.begin(9600,SERIAL_8E1) 是增加校验,当然两边都要加,这样可以保证收到的内容没错。

parseInt里面隐藏了太多细节,出错的时候不好估计原因,所以你应该用readString/read之类的办法来取到原始接收到的数据来看是否正确接收了。

readString返回的内容是字符串,你赋值到整数肯定是出错,这样说来代码也不是你自己写的吧,连变量类型都没搞懂,建议先学一下语法,否则你不可能自己进行程序调试的。

sanri14 发表于 2018-8-10 20:34:50

spirn 发表于 2018-8-10 11:37
Serial.begin(9600,SERIAL_8E1) 是增加校验,当然两边都要加,这样可以保证收到的内容没错。

parseInt里 ...

是,我是初学者,之前没有编程基础。这段代码是修改别人的,不是我自己写的。前面的变量abcde,还有val1那些也定义为String,但是还是不能通过。能否帮忙修改一下完整的代码?谢谢
页: [1]
查看完整版本: 用蓝牙实时模仿人手的机械手