■ 问题提出
在 带有128KB缓存的AD7606模拟采集板[1] 后面更新了不带板内缓冲区的C51程序。采集板与计算机之间存在两种实时数据通道:
- 通过USB-RS232转接串口,波特率为460800
- 通过WiFi-UART模块,波特率为460800,但是实际传输速率要小于460800
为了能够利用 STC WiFi下载程序[2] 界面作为接受数据的缓冲界面,这样就需要能够利用ASCII码来高效传输二进制数据。
传统的方式通过C51的printf函数,将二进制转换成ASCII字符串通过串口发送出去,虽然这样有很强的可读性,但是存在着很大的转换效率低下:
- 通常一个两字节(16bit)的二进制,最大需要6个字节(带有符号位)。比如有符号整数 0xd8ef : -10000。
- 为了分割连续两个数字,其间还需增加一个空格(0x20)
因此,最大需要是踹死7个字节来传输一个16bit的数据。传输效率浪费了:
![a2b72cad011efb4319c175da10b964b2.png](https://img-blog.csdnimg.cn/img_convert/a2b72cad011efb4319c175da10b964b2.png)
▲ ISP下载软件界面
■ Base64编码方式
在网页 What is Base64 Encoding and How does it work? | Base64Encoder[3] 给出了Base64编码的具体方式。它将连续三个字节(24bit)转换成四个6bit组,按照下面的表格找到对应的ASCII码。
![3a06c1fc5c420ff9538e9ca190511da9.png](https://img-blog.csdnimg.cn/img_convert/3a06c1fc5c420ff9538e9ca190511da9.png)
▲ Base64编码字符表格
这样的转换效率为
通过Base64的转换比普通的ASCI字符效率提高了:
在实际实现中,将原来的 “62”编码为$+$,修改为$*$,这样在下载程序界面可以避免换行的。整个显示是铺满Mem0界面。
■ C51编码程序和Python解码程序
1. C51的编码[4]
2. Python解码程序
■ 最大采样速率测试结果
经过测试,在 带有128KB缓存的AD7606模拟采集板[1] 上,对八个通道进行周期为1毫秒的采集,实际上传速率为 16kByte/s。再乘以编码增益,则实际上传速率为:21.3kByte/秒.
![db2a39e16bc881de79ad55b30953df0d.gif](https://img-blog.csdnimg.cn/img_convert/db2a39e16bc881de79ad55b30953df0d.gif)
最大速率上载数据
![a8648dcd5b5c1ef2ea5e063f8571ede5.png](https://img-blog.csdnimg.cn/img_convert/a8648dcd5b5c1ef2ea5e063f8571ede5.png)
▲ 通过AD7606采集板采集到的两个通道的信号波形
■ 结论
通过Base64编码,将原来的3个字节的数据编码成4个字节的ASCII字符,可以在适合ASCII存储显示的界面完成二进制数据的传递。这大大提高数据的传输效率。
参考资料
[1]
带有128KB缓存的AD7606模拟采集板: https://zhuoqing.blog.csdn.net/article/details/105980787
[2]
STC WiFi下载程序: https://zhuoqing.blog.csdn.net/article/details/105999836
[3]
What is Base64 Encoding and How does it work? | Base64Encoder: https://www.base64encoder.io/learn/
[4]
说明: C51工程文件:C51STCToolsAD7606Sample8G1KNoBufferSample8G1KNoBuffer.uvproj