老刘307 2020-08-08 14:40 采纳率: 66.7%
浏览 1340
已采纳

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”
在串口收到数据时,向下级设备转发数据,并接受下级设备反馈回来的数据,从串口输出。

  • 写回答

3条回答 默认 最新

  • soar3033 2020-08-08 20:36
    关注

    你把 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;
                }
        }
    
      }
    
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码