怎么解析来自外部串口的数据?-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3398|回复: 5

[未解决] 怎么解析来自外部串口的数据?

[复制链接]
发表于 2021-7-18 12:52 | 显示全部楼层 |阅读模式
新手,拜托各位大佬,
怎么解析来自外部设备数据?我想使用模拟串口接收来自STM32的串口数据,数据内容是FA E0 10 00 67 02 A8 0A 18 19 F3 FF A2 F3 AE 16 25 0E 10 EC AF D1 AD 9B,其中开头部分的FA E0 10 00永远不会改变,但第五和第六字节的数据会发生变化,如何捕获67 02这两个字节位置的内容?并将其转换为十进制的值。(例如67 02进行转换,两个字节需要调换位置变为02 67,最终十进制结果是615)

我当前使用的代码是
  1. #include <SoftwareSerial.h>
  2. SoftwareSerial mySerial(10, 11); // RX, TX
  3. void setup()
  4. {
  5.   Serial.begin(115200);
  6.   mySerial.begin(115200);
  7. }
  8. while (mySerial.available() > 0)
  9. {
  10.    Serial.write(mySerial.read());
  11. }
复制代码


发表于 2021-7-18 16:46 | 显示全部楼层
本帖最后由 topdog 于 2021-7-19 22:17 编辑

参见我的文章《串口接收十六进制代码控制点灯》,《Arduino16进制字符串转ASCII(下)》,单频电波钟接收模块解析中国码(BPC码) (下),学习一下字符串函数的应用。

根据你的需求程序书写如下:
[pre]String inputString = "";
bool Status = false;

void setup()
{
  Serial.begin(9600);
  inputString.reserve(200);
}

void loop()
{
  if (Status)
  {
    Serial.println(inputString);
    char First = inputString.charAt(15);
    char Second  = inputString.charAt(16);
    char Third  = inputString.charAt(12);
    char Fourth  = inputString.charAt(13);
    int Val = HexChangeDec(First) * 16 * 16 * 16 + HexChangeDec(Second) * 16 * 16 + HexChangeDec(Third) * 16 + HexChangeDec(Fourth);
    Serial.println(Val);


    inputString = "";
    Serial.flush();

    Status = false;
  }
}

int HexChangeDec(char ch)
{
  return (ch - '0' > 10) ? ch - '0' - 7 : ch - '0';
}

void serialEvent()
{
  if (Serial.available())
  {
    char inChar = (char)Serial.read();
    inputString += inChar;
    if (inChar == '\n')
    {
      Status = true;   
    }
  }
}[/pre]

实验效果展示:

解析字符串.jpg
祝学习愉快。


 楼主| 发表于 2021-7-18 22:44 | 显示全部楼层
本帖最后由 XR8022 于 2021-7-18 22:55 编辑
topdog 发表于 2021-7-18 16:46
参见我的文章《串口接收十六进制代码控制点灯》,《Arduino16进制字符串转ASCII(下)》,单频电波钟接收模 ...

大大,从STM32发送来的数据是16进制的哦(以HEX形式接收,不是String类型,应该怎么解析啊?
代码中获取数据是write方式
  1. Serial.write(mySerial.read());
复制代码
串口调试助手接收结果如图


图中97 02位置对调后,解析结果为663

图中97 02位置对调后,解析结果为663
发表于 2021-7-18 23:29 | 显示全部楼层
本帖最后由 topdog 于 2021-7-18 23:30 编辑

文章里面有提到自己去看吧。十进制、十六进制和ASCII码的互换。内容换成:FA E0 10 00 97 02 A8 0A 18 19 F3 FF A2 F3 AE 16 25 0E 10 EC AF D1 AD 9B
解析字符串1.jpg

事实胜于雄辩,答案正确,说明程序有效。

发表于 2021-7-20 00:39 | 显示全部楼层
为你写了一篇《软串口(SoftwareSerial)的模拟和解析》,https://www.arduino.cn/forum.php ... mp;extra=#pid618910
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-29 04:06 , Processed in 0.076188 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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