请教Arduino UNO串口输出16进制指令控制测距模块问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 749|回复: 11

[已解决] 请教Arduino UNO串口输出16进制指令控制测距模块问题

[复制链接]
发表于 2022-8-9 15:28 | 显示全部楼层 |阅读模式
本帖最后由 dapeng97 于 2022-8-17 11:35 编辑


2022年8月17日更新:
之前的程序没有问题,经过测试,激光测距模块上的rx跟tx标反了。
同时我外接的分压线路电阻过大,导致模块rx、tx引脚的电流过小检测失败。
目前直接去掉分压电路,并正确连接rx、tx后,接收到模块返回的信号了。





++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
各位大大好,

目前手里一块Arduino UNO和一个激光测距模块,模块通过串口接收形如“FA 06 04 FC”的16进制命令来工作。
目前通过使用USB-TTL的串口模块连接激光测距模块,然后在串口工具上输入命令,是可以正常通信和工作的,如图所示。图1是该模块,供电使用的3.3v。图2是该模块的一部分通信协议。图3是使用串口工具通信的情况,可以看到发出了“FA 04 01 80 81”的指令后,正常收到了模块返回的“FA 04 81 81”的操作成功回复。
图片5.png
图1
图片4.png
图2
图片3.png
图3
然后我就使用Arduino的软串口跟模块进行通信,并将模块的返回值通过串口监视器输出到屏幕上。测试程序代码如下:
  1. #include  <SoftwareSerial.h>

  2. SoftwareSerial mySerial(2, 3); // 设置软串口2-RX 3-TX
  3. unsigned char ADD[5] = {0xFA, 0x04, 0x01, 0x80, 0x81};
  4. byte data[5] = {0};

  5. void setup()
  6. {
  7.     Serial.begin(9600);
  8.     mySerial.begin(9600);
  9.     mySerial.listen();
  10. }

  11. void loop()
  12. {
  13.     mySerial.write(ADD, 5);
  14.     delay(100);
  15.     if(mySerial.available()>0)
  16.       {
  17.           mySerial.readBytes(data,5);
  18.           for(int i=0;i<5;i++)
  19.           {
  20.               Serial.print(data[i]);
  21.           }
  22.       }
  23.     delay(1000);
  24. }
复制代码

代码正常上传至Arduino中,但是串口监视器中却没有任何显示,如图4
图片2.png

图4
然后我写了个简单的测试查看Arduino是否正常输出指令,用串口工具监视Serial.write(ADD, 5)传输出来的数据,可以从串口工具中看到命令确实正常输出,也是模块需要的格式。如图5。
图片1.png
图5

所以目前就很疑惑,到底哪里出了问题导致工作错误。

发表于 2022-8-9 19:50 | 显示全部楼层
Uno的话是 5v ttl 电平,不知道是不是这个原因
 楼主| 发表于 2022-8-9 19:53 | 显示全部楼层
Zoologist 发表于 2022-8-9 19:50
Uno的话是 5v ttl 电平,不知道是不是这个原因

这个原因考虑到了,我在外面接了一组分压电路,保证了模块的rx引脚输入在3.2v左右,但是还是不行

点评

接线检查过,两根rx、tx来回倒也测试了,我换个板子试试吧  发表于 2022-8-10 11:22
换 esp32 或者 2560 试试看?软串口发送一般没问题,接收会有问题。另外,你的 tx rx交叉了么,共地了么  发表于 2022-8-10 11:10
发表于 2022-8-10 11:17 | 显示全部楼层

byte ADD[5] = {0xFA, 0x04, 0x01, 0x80, 0x81};



  for (int i = 0; i <= 5; i++)
  {
    mySerial.write(ADD[i]);
  }
命令应该是这样的形式发出去吧

点评

Serial.write(buf, len) buf: 同一系列字节组成的数组 len: 要发送的数组的长度 我看write()的语法可以一次性发送数组  发表于 2022-8-10 11:24
发表于 2022-8-10 11:47 | 显示全部楼层
myself1820 发表于 2022-8-10 11:17
byte ADD[5] = {0xFA, 0x04, 0x01, 0x80, 0x81};

哦,学习了,我一直都是按照我那种方法
 楼主| 发表于 2022-8-10 11:53 | 显示全部楼层
myself1820 发表于 2022-8-10 11:47
哦,学习了,我一直都是按照我那种方法

请教一下,我刚用串口工具又测试了一下,我发现用他的上位机发送命令时,是一次性发送一个长度为5字节的16进制命令出去,然而在用Arduino的时候,不论是用我的Serial.write(buf,len)还是你的Serial.write(ADD)的方式,发送出去的数据都是3或4的长度,也就是说一个5字节长度的命令,arduino分为了两次发送出去(不知道可不可以这么理解),我考虑是不是这个原因,图片在楼下
 楼主| 发表于 2022-8-10 11:55 | 显示全部楼层
企业微信截图_20220810115244.png 这是用上位机测试时发送的命令


企业微信截图_20220810115423.png 这是Arduino通过串口发送出来的命令
发表于 2022-8-10 14:47 | 显示全部楼层
那你试试用我的这种方法发看行不行

点评

我试过了你这种方式也是一样的结果,然后我换了一块Arduino Nano测试,我发现Nano通过串口发出来的指令就是5字节的数据,我准备拿这个再试一下  发表于 2022-8-10 15:15
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 00:47 , Processed in 0.224162 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表