UART协议解析

示例1:接收十六进制数据

  • 波特率115200
  • 停止位1位
  • 数据位8位
  • 发送十六进制数据0xABC 一共是12位

image-20231202193201959

下面使用逻辑分析仪对uart信号进行捕获

  • 连接好硬件
  • 配置好逻辑分析仪上位机参数

    image-20231202193656093

image-20231202193743978

  • 点击捕获

    image-20231202194013584

image-20231202194118872

以上是我们捕获到的信号,来对信号进行解析

uart协议由 起始位+数据位+停止位组成 这里我们并没有添加基偶校验,起始位1位+数据位8位+停止位1位

0XAB协议解析为 0110101011 我们去掉起始位和停止位,数据位为 1101 0101

又由于UART的数据位为LSB 所以我们实际得到的数据为: 1010 1011 即对应0xAB

再来看一下0x0C 协议解析为 00011 00001 掐头去尾之得到的数据为 0011 0000,LSB转化后就是0x0C,可以看到我们这里实际上是浪费了4位数据, 所以在发送十六进制数据的时候最好是八位一起

示例2:字符数据

image-20231202200806083

这里ABC对应的数据为0x41= 65 0x42=66 0x43 = 67 实际上就是ASCII

image-20231202200947835

示例3:添加换行

image-20231202202743382

image-20231202202758082

image-20231202202905818

解释如下:

根据提供的逻辑分析仪截图,显示了一系列UART数据帧,包括十六进制数值 0x410x420x430x0D0x0A

  • 0x41 对应于ASCII字符 'A'
  • 0x42 对应于ASCII字符 'B'
  • 0x43 对应于ASCII字符 'C'

接下来的两个值 0x0D0x0A 对应于回车(Carriage Return, CR)和换行(Line Feed, LF)控制字符:

  • 0x0D 是回车(CR),在ASCII中用于指示光标位置回到一行的开头。
  • 0x0A 是换行(LF),在ASCII中用于指示光标移动到下一行。

在文本通信中,特别是基于Windows系统的环境,字符序列 CR 和 LF 一起使用 (\r\n) 来表示新的一行的开始。在Unix/Linux系统中,通常只使用换行(LF,\n)来表示新行,而在Mac系统的早期版本中,只使用回车(CR,\r)。

因此,0x0D0x0A 表明您发送了 'ABC' 后跟一个新行命令。这符合您描述的发送 'ABC' 并换行的行为。

这么分析协议明明白白~

  • 只调参数使用十六进制数据效率较高
  • 传输较多数据时,使用字符更易懂,常用Cjson库,对系统资源以及性能要求较高,加DMA方式处理较好
如果觉得我的文章对你有用,请随意赞赏