求助:Arduino向串口写16进制数据问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1317|回复: 10

[已解决] 求助:Arduino向串口写16进制数据问题

[复制链接]
发表于 2022-4-6 17:55 | 显示全部楼层 |阅读模式
本帖最后由 shory 于 2022-4-13 14:40 编辑

大家好,我在调试BL0940芯片时,需要通过串口向BL0940写入16进制指令,然后芯片回复信息。
使用串口助手调试,发送16进制 58 AA 串口助手能成功收到芯片回复的报文;但是使用Arduino发送,却始终收不到。实测Arduino已经将 58 AA 发出。我在想应该是我发送的有问题吧?
官方数据手册发送数据格式:
  1. 通过命令“(0x58) + 0xAA”,BL0940 会返回一个全电参数数据包。
复制代码

芯片回复报文类似:
  1. 55 78 6C 00 F0 A5 00 77 03 00 BC A7 77 30 02 00 39 40 FF E0 01 00 FF FF FF 00 00 00 66 01 00 FE 03 00 95
复制代码


Arduino代码如下:
  1. #include <SoftwareSerial.h>

  2. SoftwareSerial DataToHMISerial(10, 11); //rxPin, txPin

  3. byte getBL0940AllData[2] = {0x58, 0xAA};

  4. void setup() {
  5.     Serial.begin(4800);
  6.     DataToHMISerial.begin(4800);
  7. }

  8. void loop() {
  9.    
  10.     Serial.write(getBL0940AllData, 2);
  11.     delay(500);
  12.    
  13.     while(Serial.available()) {
  14.         byte r = Serial.read();
  15.         DataToHMISerial.print(r, HEX);
  16.         DataToHMISerial.print(" ");        
  17.     }
  18.     DataToHMISerial.println();
  19.     delay(1000);

  20. }
复制代码


发表于 2022-4-7 13:53 | 显示全部楼层
用 Serial.write(val);
write()写二进制数据到串口,数据是一个字节一个字节地发送的,若以字符形式发送数字请使用print()代替。
语法:

Serial.write(val)Serial.write(str)Serial.write(buf, len) Arduino Mega也支持:Serial1, Serial2, Serial3(在Serial的位置)
参数:

  • val: 作为单个字节发送的数据
  • str: 由一系列字节组成的字符串
  • buf: 同一系列字节组成的数组
  • len: 要发送的数组的长度
返回:

  • byte
write()会返回发送的字节数,所以读取该返回值是可选的。
示例:

void setup(){  Serial.begin(9600);}void loop(){  Serial.write(45); //以二进制形式发送数字45   int bytesSent = Serial.write(“hello”); //发送字符串“hello” 并返回该字符串的长度。}
 楼主| 发表于 2022-4-8 14:29 | 显示全部楼层
ahua7336 发表于 2022-4-7 13:53
用 Serial.write(val);
write()写二进制数据到串口,数据是一个字节一个字节地发送的,若以字符形式发送数 ...

谢谢,还是不行。
  1. Serial.flush();
  2. Serial.write(0x58);
  3. Serial.write(0xAA);
复制代码

可以输出,但是报文格式和长度都不对。
发表于 2022-4-8 15:16 | 显示全部楼层
 楼主| 发表于 2022-4-13 09:41 | 显示全部楼层
谢谢各位,最终我发现是我的ESP12-F Rx 引脚好像有问题,换了一个模块就好了。
另外,得到数据存储在 char 数组中,在网上找到方法,但是并不能算出正确结果。

  1. data[3] = {0xBC,0xA7,0x77};
  2. uint32_t result = data[2] << 16 | data[1] << 8 | data[0];
复制代码
 楼主| 发表于 2022-4-13 14:39 | 显示全部楼层
shory 发表于 2022-4-13 09:41
谢谢各位,最终我发现是我的ESP12-F Rx 引脚好像有问题,换了一个模块就好了。
另外,得到数据存储在 char  ...

我已经解决了
  1. (uint32_t(data[12])&0xFF) <<16 | (uint32_t(data[11])&0xFF) <<8 | (uint32_t(data[10])&0xFF)
复制代码
 楼主| 发表于 2022-4-14 15:48 | 显示全部楼层
shory 发表于 2022-4-13 09:41
谢谢各位,最终我发现是我的ESP12-F Rx 引脚好像有问题,换了一个模块就好了。
另外,得到数据存储在 char  ...

我再一次发现,应该是连接 Rx 引脚 PC817 的光耦的问题...
发表于 2022-5-6 20:41 | 显示全部楼层
楼主  ,接收到的16进制数据怎么变成 和 16进制一样的字符串呢
 楼主| 发表于 2022-5-7 11:54 | 显示全部楼层
haiden 发表于 2022-5-6 20:41
楼主  ,接收到的16进制数据怎么变成 和 16进制一样的字符串呢

定义一个 char 数组 char comData[10];
然后串口接收 Serial.readBytes(comData, 10);
16进制数据都在数组里面了啊.然后按需要进行处理。
发表于 2022-5-17 20:35 | 显示全部楼层
楼主 能否把读取BL0940数据的代码发下,现在刚好需要用到这个芯片呃呃呃
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 05:40 , Processed in 0.099796 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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