一、前言
手里有两款USB转485串口,不同品牌,不同芯片,一个是UT-890购于JD芯片为FT232+SP213,一个是信泰微购于TB芯片为CH340,二者价格差异也较大,前者远高于后者
以下为测试环境:
串口设置:波特率115200,数据位8,停止位1,无校验,无流控
数据情况:整帧数据长度为9字节,地址(1字节)+指令(1字节)+数据长度(1字节)+数据(4字节)+crc(2字节)
传输频率:单个设备主动不停发送数据,频率约10ms
接收线程:sleep 3ms,相当于隔3ms读取一次数据
二、现象
信泰微:
一开始用的就是该USB转485没有其他参照所以并未意识到该问题,将串口读到数据打印出来,下面是三分钟数据内的一部分,可以看到基本收到的是整帧数据,偶尔会收到多倍的整帧数据,但可以明显看出每次读到的缓冲区内的数据是完整的
应该是由于驱动的区别该USB转485的高级设置如下
UT-890:
这里涉及了串口转485的一个小小的配置问题,我的电脑-管理-设备管理器-端口-右键属性-端口设置-高级
本来延时计时器默认参数为16ms,采集得到数据总是大于9字节网上搜索一番发现修改此处配置可提高串口响应速度(大概相当于提升底层驱动放到缓冲区的频率?个人猜测
修改延时计时器为1ms后,大部分从缓冲区里读到的数据小于或等于9字节,偶尔也有长度远超整帧数据(不一定为整倍数),但总之缓冲区中得到的数据非整帧长度是非常的多
三、分析
首先研究了一下用的串口类的读数据超时是Readfile立即返回不会有延时,也就是缓冲区有什么就读什么;
同时比较计算过二者相同时间读到的数据条数并未发现有数据丢失情况,也就是应该不存在芯片缓存区过小
也换过设备和另一根USB转485得到结果相同
然后询问USB转485厂家无果,只推荐字节流解析,但未给出原因
和其他人交流后也感觉原因可能是在二者底层驱动或者芯片逻辑上有区别
四、结论
个人觉得这样可以下结论这个问题就是出在两个USB转串口的底层数据传输机制上了,或者应该可以说跟二者的驱动关系很大
这是个很有趣的现象,特此记录下来看以后有没有更深入或者正确的认识,也分享出来看有没有大神可以解惑,感谢