• 串口调试助手和网络调试助手使用总结


    串口调试助手和网络调试助手是用的比较多的两款工具。

    先来看看串口调试助手。

    本人用的比较多的串口助手是正点原子的XCOM以及大虾丁丁的SSCOM

    首先,解决下串口收发时的统计问题。

    注意:这里统计的单位是字节。

    串口工具发送时,就只统计你发了多少个字节,发几个就是几个,不考虑底层的协议位。

    接收时呢?具体是怎么统计的呢?

    比如,我在程序里用printf向串口发了个uint8_t类型的数据100

    然后在串口工具上看到了一次发送的统计是5,也就是5个字节,我就觉得很奇怪,明明只发送了一个字节,怎么有这么多呢?

    加上开始位结束位,也就一共10bit,另外再加上回车和换行,也就3个字节加上2bit,不管怎么算,都是没有5字节的。

    于是,我在串口中以HEX形式来显示接收到的数据。

    确实是每次收到了5个字节31 30 30 0D 0A

    然后去ascii码中对比,发现了这几个字节正好对应的是:

    “字符1字符0字符0回车换行”

    原来如此!串口接收并显示,实际上是显示的字符串,当串口工具接收到数据时,为了显示出来,会将其转换成字符串形式,然后以一个一个字符的形式展示出来。

    也就是说,串口的接收统计也没有统计底层的协议位,只是统计了数据转成字符串后一共有多少个字符。

    当然,这只是串口工具的统计逻辑,其他地方的统计逻辑不一定是这样,不要一概而论。

    按照这个逻辑,如果我发送了一个9876,那么串口会显示多少呢?

    加上回车换行应该是6位,而不必去考虑这个数发送的时候是什么类型的,只需要考虑发送的数据有多少个字符即可。4个数字字符+1个回车+1个换行,就是=6。

    经验证,确实如此。

    这样看来,这个接收统计并不能反应接收到了多少字节的数据,只能反应接收到了多少个字符。

    知道了这个,回过头看一下,如果发送时不勾选以16进制发送的话,也是按照字符个数来统计的。经验证,也确实如此。

    以上程序向串口发送时使用的十进制,那么,如果直接就发的是十六进制呢?跟发十进制是一样的。比如发了个0x64,串口助手照样显示100,照样显示一次接收5个字节。

    然后,我试了下不用%d而是用%x去发送

    显示的就是十六进制的3456。

    由此可见,printf时,串口是按照printf函数指定的形式去展示的。

    但是,统计仍然是按照字符形式去统计,以十六进制显示时,也是按照字符一个一个显示。

    即,串口按照printf指定的形式,将实际的数据用字符串表示出来。

    这么说吧,在显示屏上能看到一切内容,都是字符串的形式,不管底层是什么编码,最终展现出来的都是字符串形式。

    所以说,串口工具中是怎么显示的,就要看你printf是怎么指定的,此时,选择以十六进制显示,只是以字符的ascii码的形式展示出来而已。

    还有另外一种情况,就是不用printf来发送,直接使用串口发送。

    这时候,串口工具是用什么形式来接收呢?

    这里又引出了一个问题,这个显示格式化,是由串口工具来处理的,还是由printf来处理后发出的,然后串口工具只是所收即所得,所得即所见呢?

    也就是说,串口工具只负责接收并显示,并不去格式化处理。举个例子,有个数据100,我用printf发送,格式为%X,那么,printf就将数据格式化成字符6和4,然后直接发送字符6和字符4的ascii给串口,串口接收到数据,直接先显示出来了,如果是十六进制展示,那么就直接显示收到的ascii码,如果不以ascii码的形式显示,就直接显示对应的字符。

    这个问题的确认,就需要不使用printf来发送数据。

    直接从串口引出一根数据线加上一根地线,监控串口发送的数据。

    本质上,串口工具接收到的是一个一个的二进制位,此时,串口中用十六进制显示,就显示的是对应的十六进制,如果不用十六进制显示,就要看此时十六进制有没有对应的字符,如果有,就可以显示出来,如果没有,就显示不出来,所以,这种情况下,就会经常出现各种各样的乱码。

    为什么用printf发送时,不会出现乱码呢?因为本来就是将预期的有序数据通过printf转成了对应字符的ascii码,再将其还原到串口工具时,自然还是预期的数据。

    这也能引申出一个问题,那就是为什么有时候编码错了,会出现乱码,那是因为接收到的编码,在当前编码库里找不到对应的符号,无法显示对应的字符,所以就乱码了。

    总结来说

    屏幕字符串显示的背后,是各种编码。

    收到一种编码,然后根据编码来显示对应的字符,实际显示字符时,就需要向屏幕打点或者做出对应的动作,如果是可显示字符,就打点显示,如果不是可显示字符,比如换行,就让屏幕进行换行操作。

    串口是你发啥就显示啥,要么直接显示ascii码,要么显示对应的符号。

    用printf发送时,是由该函数自己来格式化处理的,制定成什么形式,该函数就将数据格式化成什么形式,然后再发送对应的ascii编码,串口工具接收后,并不做处理,直接按照ascii编码或者字符串形式显示即可。

    接着解决下波特率计算的问题

    可直接参考这篇文章

    通过串口波特率计算数据传输速率(每秒字节数)_串口传输速率_地球被支点撬走啦的博客-CSDN博客

    在只有起始位和1位停止位的情况下,传输一个字节的数据包长度为 10 个 bits ,这种情况下的每秒钟可以传输的字节数为 :9600/10=960 bytes 。如果考虑奇偶校验位的话就是 9600/11=872.72 bytes 。

    也就是说,是波特率除以10,而不是直接除以8。

    这里要注意的是,串口时序是,每个字节都有一个开始位和一个结束位,而不是开始位+好多字节的数据+结束位,而是开始位+一个字节+结束位,然后又是开始位+一个字节+结束位

    这就是为什么指定数据位的位数,如果是好多数据,那么指定这个数据位的位数就没有意义了。

    再简单说下串口工具的用法

    选择十六进制发送时,只能输入十六进制。

    通常在发送协议时,都需要选择16进制发送和16进制显示。

    其他同类型工具大同小异。

    注意,这个工具在发送多字符串指令时,需要勾选前面的HEX框,才会以16进制发送,否则当做字符串发送。

    然后说下网络调试助手

    可以使用网络调试助手NetAssist或者大虾丁丁的SSCOM

    使用方法大同小异,这里以网络调试助手NetAssist为例讲解。

    直接参考:

    NetAssist使用_故里2130的博客-CSDN博客

    比较简单,略。

  • 相关阅读:
    java毕业设计基于javaweb+mysql数据库实现的校园迎新(新生报道)网站含论文+开题报告
    2.9每日一题(定积分的奇偶性以及比较大小)
    空气开关(空开)
    docx-preview 实现前端word预览
    kubernetes集群yaml文件与kubectl工具
    分布式系统中的乐观和错误假设
    Jetpack学习之Navigation(1)
    springfox-swagger2 2.9.2 POST方式 Description优化
    选好“建材”,为一座座数据孤岛搭起通车桥梁
    vue:基础:生命周期
  • 原文地址:https://blog.csdn.net/qq_28576837/article/details/134286502