当前位置: 代码迷 >> 驱动开发 >> COMM串口通信,怎么设计通信协议以提高通信质量
  详细解决方案

COMM串口通信,怎么设计通信协议以提高通信质量

热度:41   发布时间:2016-04-28 10:17:05.0
COMM串口通信,如何设计通信协议以提高通信质量。
单片机每隔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楼说的方式