900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Arduino串口发送与接收16进制数据(HEX)(数据乱码)-JDY-10M组网

Arduino串口发送与接收16进制数据(HEX)(数据乱码)-JDY-10M组网

时间:2021-04-13 23:07:36

相关推荐

Arduino串口发送与接收16进制数据(HEX)(数据乱码)-JDY-10M组网

最近使用JDY-10M蓝牙组网,需要Arduino收发数据,将遇到的一些问题与最终解决方法分享给大家,如果内容有问题,还请大家指点。

1、JDY-10M组网

关于如何JDY-10M如何组网网上介绍,这里不做介绍,这里贴一个链接。

(16条消息) JDY-10M蓝牙简易组网教程_jdy–10m 命令_小明ohhh的博客-CSDN博客

使用串口助手的时候,收发数据都正常,所以问题就是完成下图的功能:①波特率115200②以HEX16进制发送数据③数据开头带AAFBFFF(后面为数据内容)。

2、发送16进制数据

#include <SoftwareSerial.h>SoftwareSerial JDY(8,9);char a[] = {0xAA,0XFB,0xFF,0xFF,0x2D,0x31,0x32,0x2E,0x33,0x34};String str;void setup() {JDY.begin(115200);}void loop() {JDY.write(a,10);delay(500);}

之前代码用的硬串口Serial.write(),就出现了两个问题:①接收数据时对时错②接收数据的时间不确定(不是500ms)。改为软串口后就好了,上面发送的为-12.34。

之前接收是左边这样的(发的82),现在是右边这样(发的-12.34)

←自带串口发(时对时错)←软串口发(没有问题)

如果需要发两组或多组数据,不能连续使用.write(),中间需要delay()一下,否则串口没法接收,代码如下:

(我使用模块发送数据时,发送数据长度不能超过14,否则串口接收不到数据,不清楚为什么)

#include <SoftwareSerial.h>SoftwareSerial JDY(8,9);char a[] = {0xAA,0XFB,0xFF,0xFF,0x2D,0x31,0x32,0x2E,0x37,0x38,0x35,0x36,0x31,0x31};char b[] = {0xAA,0XFB,0xFF,0xFF,0x2D,0x31,0x31,0x2E,0x31,0x31,0x31,0x31,0x31,0x31};String str;void setup() {Serial.begin(115200);JDY.begin(115200);}void loop() {JDY.write(a,14);delay(500);JDY.write(b,14);delay(500);}

3、接收16进制数据

byte variable[80];byte index = 0;char data[10];String a;void setup(){Serial.begin(115200); }void loop(){while( Serial.available()>0 ){byte serialData = Serial.read();variable[index++] = serialData;if(index==13){for (int i=3;i<13;i++){if(variable[i]==48){data[i-3]='0';}else if(variable[i]==49){data[i-3]='1';}else if(variable[i]==50){data[i-3]='2';}else if(variable[i]==51){data[i-3]='3';}else if(variable[i]==52){data[i-3]='4';}else if(variable[i]==53){data[i-3]='5';}else if(variable[i]==54){data[i-3]='6';}else if(variable[i]==55){data[i-3]='7';}else if(variable[i]==56){data[i-3]='8';}else if(variable[i]==57){data[i-3]='9';}else if(variable[i]==45){data[i-3]='-';}else if(variable[i]==46){data[i-3]='.';}delay(10);}for (int i=0;i<10;i++){a+=data[i];}Serial.print(a);a="";index = 0;String data="";Serial.println("");}}}

因为我接收的数据总共13位,所以index=13,有用的数据从第四位开始的,所以i=3,大家根据自己情况调整。

这里面serialData为接收的原始数据,是ASCII对应的值,所以后面给改成了对应的字符,存在了a里面。

这样就可以正常接收数据了,并且没有乱码。

下面是之前用的代码,但是显示数据也是时对时错,并且时间上对不上,不建议大家使用,或者大家可以看看问题出在那里。

//此代码有问题#include <String.h>String comdata = "";void setup(){Serial.begin(115200);BT.begin(115200);}void loop(){while (BT.available() > 0) {comdata += char(BT.read());delay(2);}if (comdata.length() > 0){Serial.println(comdata);comdata = "";}}

以上就是最近几周本人的学习分享,如果有哪里不对还请大家担待指正!谢谢!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。