串口调试助手和网络调试助手是用的比较多的两款工具。
先来看看串口调试助手。
本人用的比较多的串口助手是正点原子的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为例讲解。
直接参考:
比较简单,略。