单片机每隔1ms向上位机发送1个数据包,数据包格式如下:
{0:100}{1:30000}...{9:1600}
一个数据包中有多个数据段,每个数据段用{...}表示,{}中冒号前的数值表示段号,冒号后的数值表示此段的数据。
数据的长度是不定长的。然而上位机的COMM数据读取接口要求提供大小确定的缓冲,那么如果单片机发送数据如下:
{0:100}{1:300}
{0:100}{1:30000}
{0:100}{1:3}
如果上位机缓冲区大小设置为10,则接收到的数据为
{0:100}{1:
300}{0:100
}{1:30000}
如此将造成数据不完整。
而如果缓冲区大小设置为20,则接收到
{0:100}{1:300}{0:100
}{1:30000}{0:100}{1:
虽然第一条数据{0:100}{1:300}成功接收了,但第二条数据丢失。
请问如何设置上位机缓冲区,或者通信协议以减少丢包率和提高通信质量。
使用Visual C#编写上位机接收程序,核心代码如下
// 串口参数
string portName = m_portName;
int baudRate = 115200;
Parity parity = Parity.None;
int dataBits = 8;
StopBits stopBits = StopBits.One;
// 创建和打开串口对象
SerialPort m_SerialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
m_SerialPort.Open();
// 读取数据
int offset = 0;
int count = 20;
m_SerialPort.Read(buffer, offset, count);
------解决方案--------------------
{0:100}{1:30000}...{9:1600}
为什么不改成
100:30000:1600
------解决方案--------------------
数据包为啥要这么设计?
为啥不用
bootCode len cmd datax checSum 这样的格式呢?
------解决方案--------------------
你上位机资源多的是,就设个大点的缓冲完了,大过你最大可能的数据包。如果上位机不能保证1ms内处理缓冲的数据,比如可能要2ms,那就使缓冲大于两倍的数据包最大尺寸。最好用环形缓冲 (ring buffer)
常用的通讯格式是:
起始标志+长度+命令+数据+校验
就是2楼说的方式