Arduino 串口接收转发十六进制数据,软串口收不到数据

我是Arduino初学者,今日尝试用Arduino nano 收串口发来16进制数据,再由软串口转发给下级设备,下级设备返回16进制数据。首先简单测试代码如下:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2,3);

void setup(){
  Serial.begin(9600);
  mySerial.begin(9600);
}

void loop(){
  if (Serial.available() > 0) {
    mySerial.write(Serial.read());

  }
  if (mySerial.available() > 0) {
    Serial.write(mySerial.read());

  }

}

使用串口助手发送数据,接收返回数据正常如下:

[14:18:18.096]发→◇FE FD 01 35 01 2D 01 35 01 B6 3D 9F 3B 33 3E A1 39 35 39 35 3C A1 3C 9F 3B 33 3E 9F 3B 33 3B A2 3B 35 39 33 3B 35 39 33 3B 33 3E 30 3B 33 3E 32 38 36 39 32 43 2B 3B 35 39 33 3B 33 3B 35 39 33 3E 32 39 33 3B 33 3B 35 3C 32 39 35 39 33 3B 33 3B 33 3B 35 3C 30 3B 33 3B 33 3E A1 39 33 3B A2 3B 33 3B 35 39 33 3B 35 39 33 3B 33 3B 33 3B 33 3B 33 3B 33 3E 30 3B 33 3B 33 3B 33 3E 30 3B A2 3B 33 3B 35 39 33 3B 35 39 33 3B 35 39 33 3A 33 3E 30 3E 32 39 33 3B 35 39 35 39 35 39 33 3E 32 39 35 39 33 3E 30 3B 35 39 35 39 33 3B 33 3B 33 3B 35 39 33 3B 33 3E 30 3E 30 3B 35 39 33 3B 33 3F 31 3C 32 39 33 3B 33 3E 30 3B 35 3C 32 39 35 39 35 39 35 39 A4 39 32 3E 9F 3B 36 38 33 3B 33 3B 33 3B A2 3B 36 38 A5 38 A2 3B A2 3B 33 3B A4 3C A1 39 35 3F 9E 39 33 3E 9F 3B 35 39 33 3B 35 3C 30 41 2F 39 33 3B 35 39 35 39 35 39 35 39 35 39 33 3B 33 3B 33 3B 33 3B 35 39 33 3B 35 39 35 39 35 39 35 39 33 3A 36 39 33 3B 33 3B 33 3A 33 3B 33 3B 33 3E 32 39 33 3B 35 3F 9C 3B 33 3B A2 3E 9F 3E 32 39 A2 3E 30 3B A4 3C FF □
[14:18:18.375]收←◆FE FC CF 

现尝试加入在串口无命令发过来的状态下,没间隔1S发送其他定制内容
实验代码如下:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2,3);
String item;

void setup(){
  item = "";
  Serial.begin(9600);
  mySerial.begin(9600);
}

void loop(){
  if (Serial.available() > 0) {
    mySerial.write(Serial.read());

  } else {
    if (mySerial.available() > 0) {
      item = String(item) + String(char(mySerial.read()));

    } else {
      Serial.println("hello");
      delay(1000);

    }
    if (String(item).length() > 0) {
      Serial.print(item);
      item = "";

    }

  }

}

输出结果:

[14:33:38.892]收←◆68 65 6C 6C 6F 0D 0A 
[14:33:39.893]收←◆68 65 6C 6C 6F 0D 0A 
[14:33:40.895]收←◆68 65 6C 6C 6F 0D 0A 
[14:33:41.266]发→◇FE FD 01 35 01 2D 01 35 01 B6 3D 9F 3B 33 3E A1 39 35 39 35 3C A1 3C 9F 3B 33 3E 9F 3B 33 3B A2 3B 35 39 33 3B 35 39 33 3B 33 3E 30 3B 33 3E 32 38 36 39 32 43 2B 3B 35 39 33 3B 33 3B 35 39 33 3E 32 39 33 3B 33 3B 35 3C 32 39 35 39 33 3B 33 3B 33 3B 35 3C 30 3B 33 3B 33 3E A1 39 33 3B A2 3B 33 3B 35 39 33 3B 35 39 33 3B 33 3B 33 3B 33 3B 33 3B 33 3E 30 3B 33 3B 33 3B 33 3E 30 3B A2 3B 33 3B 35 39 33 3B 35 39 33 3B 35 39 33 3A 33 3E 30 3E 32 39 33 3B 35 39 35 39 35 39 33 3E 32 39 35 39 33 3E 30 3B 35 39 35 39 33 3B 33 3B 33 3B 35 39 33 3B 33 3E 30 3E 30 3B 35 39 33 3B 33 3F 31 3C 32 39 33 3B 33 3E 30 3B 35 3C 32 39 35 39 35 39 35 39 A4 39 32 3E 9F 3B 36 38 33 3B 33 3B 33 3B A2 3B 36 38 A5 38 A2 3B A2 3B 33 3B A4 3C A1 39 35 3F 9E 39 33 3E 9F 3B 35 39 33 3B 35 3C 30 41 2F 39 33 3B 35 39 35 39 35 39 35 39 35 39 33 3B 33 3B 33 3B 33 3B 35 39 33 3B 35 39 35 39 35 39 35 39 33 3A 36 39 33 3B 33 3B 33 3A 33 3B 33 3B 33 3E 32 39 33 3B 35 3F 9C 3B 33 3B A2 3E 9F 3E 32 39 A2 3E 30 3B A4 3C FF □
[14:33:41.962]收←◆68 65 6C 6C 6F 0D 0A 
[14:33:42.962]收←◆68 65 6C 6C 6F 0D 0A 
[14:33:43.963]收←◆68 65 6C 6C 6F 0D 0A 
[14:33:44.964]收←◆68 65 6C 6C 6F 0D 0A 
[14:33:45.964]收←◆68 65 6C 6C 6F 0D 0A 
[14:33:46.965]收←◆68 65 6C 6C 6F 0D 0A 
[14:33:47.966]收←◆68 65 6C 6C 6F 0D 0A 

似乎下级设备没收到数据,无返回值,求助实现方法或解决办法

最终目的是想实现在串口没有发送数据时,按照延时发送数据包如“hello”
在串口收到数据时,向下级设备转发数据,并接受下级设备反馈回来的数据,从串口输出。

2个回答

你把 Serial.println("hello");
delay(1000);
这两句注释掉试一下。要是注释了以后能收到返回值,那就是你在delay的时候发送了数据,然后串口缓冲区溢出了。

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2,3);
String item;
int count;

void setup(){
  item = "";
    count=0;
  Serial.begin(9600);
  mySerial.begin(9600);
}

void loop(){
  if (Serial.available() > 0) {
    mySerial.write(Serial.read());
        count=0;
  } else {
    if (mySerial.available() > 0) {
      Serial.write(mySerial.read());
            count=0;
    } else {
            count++;
            if (count>100000){
      Serial.println("hello");
      count=0;
            }
    }

  }

}

taogunet
刘庆军-联通 入门较晚,觉得这个学起来还简单。多谢!
3 个月之前 回复
soar3033
soar3033 要说隐患就是 我觉得你的心跳包 就是那个一秒的hello可以发送间隔更长一点甚至取消。主要是你的那个软串口可靠性没有硬件串口高,发的越多 越频繁 出错可能性越大。做个原理实验用arduino是可以的,做产品的话还是要用单片机原生的库或寄存器开发。
3 个月之前 回复
taogunet
刘庆军-联通 稍后我采纳你的答案,谢谢
3 个月之前 回复
taogunet
刘庆军-联通 收到正常数据了谢谢,有什么隐患或注意事项吗?下面接的是一个空调遥控模块,没源码。
3 个月之前 回复
taogunet
刘庆军-联通 [18:57:44.275]收←◆68 65 6C 6C 6F [18:57:44.844]发→◇FE FD 01 35 01 2D 01 35 01 B6 3D 9F 3B 33 3E A1 39 35 39 35 3C A1 3C 9F 3B 33 3E 9F 3B 33 3B A2 3B 35 39 33 3B 35 39 33 3B 33 3E 30 3B 33 3E 32 38 36 39 32 43 2B 3B 35 39 33 3B 33 3B 35 39 33 3E 32 39 33 3B 33 3B 35 3C 32 39 35 39 33 3B 33 3B 33 3B 35 3C 30 3B 33 3B 33 3E A1 39 33 3B A2 3B 33 3B 35 39 33 3B 35 39 33 3B 33 3B 33 3B 33 3B 33 3B 33 3E 30 3B 33 3B 33 3B 33 3E 30 3B A2 3B 33 3B 35 39 33 3B 35 39 33 3B 35 39 33 3A 33 3E 30 3E 32 39 33 3B 35 39 35 39 35 39 33 3E 32 39 35 39 33 3E 30 3B 35 39 35 39 33 3B 33 3B 33 3B 35 39 33 3B 33 3E 30 3E 30 3B 35 39 33 3B 33 3F 31 3C 32 39 33 3B 33 3E 30 3B 35 3C 32 39 35 39 35 39 35 39 A4 39 32 3E 9F 3B 36 38 33 3B 33 3B 33 3B A2 3B 36 38 A5 38 A2 3B A2 3B 33 3B A4 3C A1 39 35 3F 9E 39 33 3E 9F 3B 35 39 33 3B 35 3C 30 41 2F 39 33 3B 35 39 35 39 35 39 35 39 35 39 33 3B 33 3B 33 3B 33 3B 35 39 33 3B 35 39 35 39 35 39 35 39 33 3A 36 39 33 3B 33 3B 33 3A 33 3B 33 3B 33 3E 32 39 33 3B 35 3F 9C 3B 33 3B A2 3E 9F 3E 32 39 A2 3E 30 3B A4 3C FF □ [18:57:45.131]收←◆FE FC CF [18:57:45.455]收←◆68 65 6C 6C 6F [18:57:45.774]收←◆68 65 6C 6C 6F
3 个月之前 回复
soar3033
soar3033 回答里的程序改了一下,你再试试
3 个月之前 回复
soar3033
soar3033 有可能这些ff都是下级设备返回的 你下机设备的代码有吗
3 个月之前 回复
taogunet
刘庆军-联通 回复soar3033: [12:17:01.861]收←◆68 65 6C 6C 6F [12:17:02.457]收←◆68 65 6C 6C 6F [12:17:03.054]收←◆68 65 6C 6C 6F [12:17:03.889]发→◇FE FD 01 35 01 2D 01 35 01 B6 3D 9F 3B 33 3E A1 39 35 39 35 3C A1 3C 9F 3B 33 3E 9F 3B 33 3B A2 3B 35 39 33 3B 35 39 33 3B 33 3E 30 3B 33 3E 32 38 36 39 32 43 2B 3B 35 39 33 3B 33 3B 35 39 33 3E 32 39 33 3B 33 3B 35 3C 32 39 35 39 33 3B 33 3B 33 3B 35 3C 30 3B 33 3B 33 3E A1 39 33 3B A2 3B 33 3B 35 39 33 3B 35 39 33 3B 33 3B 33 3B 33 3B 33 3B 33 3E 30 3B 33 3B 33 3B 33 3E 30 3B A2 3B 33 3B 35 39 33 3B 35 39 33 3B 35 39 33 3A 33 3E 30 3E 32 39 33 3B 35 39 35 39 35 39 33 3E 32 39 35 39 33 3E 30 3B 35 39 35 39 33 3B 33 3B 33 3B 35 39 33 3B 33 3E 30 3E 30 3B 35 39 33 3B 33 3F 31 3C 32 39 33 3B 33 3E 30 3B 35 3C 32 39 35 39 35 39 35 39 A4 39 32 3E 9F 3B 36 38 33 3B 33 3B 33 3B A2 3B 36 38 A5 38 A2 3B A2 3B 33 3B A4 3C A1 39 35 3F 9E 39 33 3E 9F 3B 35 39 33 3B 35 3C 30 41 2F 39 33 3B 35 39 35 39 35 39 35 39 35 39 33 3B 33 3B 33 3B 33 3B 35 39 33 3B 35 39 35 39 35 39 35 39 33 3A 36 39 33 3B 33 3B 33 3A 33 3B 33 3B 33 3E 32 39 33 3B 35 3F 9C 3B 33 3B A2 3E 9F 3E 32 39 A2 3E 30 3B A4 3C FF □ [12:17:04.206]收←◆FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF [12:17:04.239]收←◆FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3 个月之前 回复
soar3033
soar3033 你把结果贴一下看看
3 个月之前 回复
taogunet
刘庆军-联通 实验结果返回都是FF
3 个月之前 回复
taogunet
刘庆军-联通 #include <SoftwareSerial.h> SoftwareSerial mySerial(2,3); volatile int count; String item; void setup(){ Serial.begin(9600); mySerial.begin(9600); count = 0; item = ""; } void loop(){ if (Serial.available() > 0) { mySerial.write(Serial.read()); count = 0; } else { if (mySerial.available() > 0) { item = String(item) + String(char(Serial.read())); count = 0; } else { count = count + 1; if (count > 10000) { Serial.print("hello"); count = 0; } } if (String(item).length() > 0) { Serial.print(item); item = ""; } } }
3 个月之前 回复
taogunet
刘庆军-联通 [09:43:38.442]收←◆68 65 6C 6C 6F [09:43:39.286]发→◇FE FD 01 35 01 2D 01 35 01 B6 3D 9F 3B 33 3E A1 39 35 39 35 3C A1 3C 9F 3B 33 3E 9F 3B 33 3B A2 3B 35 39 33 3B 35 39 33 3B 33 3E 30 3B 33 3E 32 38 36 39 32 43 2B 3B 35 39 33 3B 33 3B 35 39 33 3E 32 39 33 3B 33 3B 35 3C 32 39 35 39 33 3B 33 3B 33 3B 35 3C 30 3B 33 3B 33 3E A1 39 33 3B A2 3B 33 3B 35 39 33 3B 35 39 33 3B 33 3B 33 3B 33 3B 33 3B 33 3E 30 3B 33 3B 33 3B 33 3E 30 3B A2 3B 33 3B 35 39 33 3B 35 39 33 3B 35 39 33 3A 33 3E 30 3E 32 39 33 3B 35 39 35 39 35 39 33 3E 32 39 35 39 33 3E 30 3B 35 39 35 39 33 3B 33 3B 33 3B 35 39 33 3B 33 3E 30 3E 30 3B 35 39 33 3B 33 3F 31 3C 32 39 33 3B 33 3E 30 3B 35 3C 32 39 35 39 35 39 35 39 A4 39 32 3E 9F 3B 36 38 33 3B 33 3B 33 3B A2 3B 36 38 A5 38 A2 3B A2 3B 33 3B A4 3C A1 39 35 3F 9E 39 33 3E 9F 3B 35 39 33 3B 35 3C 30 41 2F 39 33 3B 35 39 35 39 35 39 35 39 35 39 33 3B 33 3B 33 3B 33 3B 35 39 33 3B 35 39 35 39 35 39 35 39 33 3A 36 39 33 3B 33 3B 33 3A 33 3B 33 3B 33 3E 32 39 33 3B 35 3F 9C 3B 33 3B A2 3E 9F 3E 32 39 A2 3E 30 3B A4 3C FF □ [09:43:39.604]收←◆FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3 个月之前 回复
taogunet
刘庆军-联通 最终目的是想实现在串口没有发送数据时,按照延时发送数据包如“hello” 在串口收到数据时,向下级设备转发数据,并接受下级设备反馈回来的数据,从串口输出。
3 个月之前 回复
soar3033
soar3033 一个方案是假如你的arduino可以用定时器中断的话通过中断来发hello。要么就是在你的loop里对一个变量进行自加,加到一定值就发送hello,以此达到延时发送的效果。
3 个月之前 回复
taogunet
刘庆军-联通 确实是这个原因,有什么好办法吗?
3 个月之前 回复

串口调试助手排查下,特别是波特率、停止、校验位、端口号这些设置。

taogunet
刘庆军-联通 波特率、停止、校验位、端口号都没问题,如上能收到软串口发过来hello
3 个月之前 回复
立即提问