打印
[应用相关]

USB虚拟串口要命的丢数据

[复制链接]
5702|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chunxx|  楼主 | 2009-3-28 14:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
换了一个硬盘,从Windows2000换到XP,原来在测试的一个数据采集板突然就不能用了。应用板是STM32F103VB,USB口发送采集的数据到PC,偷了一点懒,直接用虚拟串口的例子改的USB通信程序,这部分程序在Window2000下用了两个多月了,一直好好的。
理所当然想到是PC端接收程序的问题,不过PC端程序的资历更老,封装的类已经用了好几年,有四五个Project用过,一直没问题。好在这个也是自己写的,可以改,在UART配置,多线程、Overlapped读写之间钻来钻去,能试的都试过了,就是没有进展。基本的现象,Slave发送的数据包为2176、4352Bytes两种,4352的包只能收到前边的4096Byte,2176的包就收不到,直到后面再发的数据加起来超过4096,又收到一个4096的包,也就是每次只能收4096大小的包。用分散的数据发过来测试,64Byte内可以接收,大于64Byte又会丢数据或者不能及时在Readfile中出现。
折腾了整整10天,实在没脾气了,只能无聊地到应用板这边改一下。STM32这边的数据发送,按虚拟串口Buffer大小,分成64Byte大小的包,最后一包不足64Byte,延时50ms后也自动发出去,发的数据都可以用示波器看到,不会有漏发的。发送每个包之间加上100ms延时,没有作用;把发送包的大小改成62Byte,突然就行了!再试,只要小于64Byte,怎么折腾都没问题!
发送包长还是64Byte,把数据填满4096Byte再发,只要是4096,8192这样的N个4096大小的包,接收都没有问题!
大致总结,虽然都是Win32,Window2000和XP的Readfile流控制机制有不同的,XP总是试图去读满4096Byte(1扇区?)才返回,4096以下,估计又有另一套机制。对于USB虚拟串口,Baud率设置是不起作用的,设定9600也能收115200发的数据,COMM的TimeOut似乎也不起作用,至少不是按传统UART接口那样起作用的。内部还有什么机制,恐怕要看VCPDriver甚至Win32的源码才知道,只能回避这一点,把发送数据包设成小于64Byte,不过发送大量数据(1MB左右)时,明显感到63Byte的包Size,速度要比64Byte低得多,还有必要进一步深入。
精疲力尽不想再挖下去,丢下了一大堆正经活没干,看似最简单不过的串口,也能叫老鸟折戟沉沙。
沙发
McuPlayer| | 2009-3-28 17:26 | 只看该作者

我用的是XP系统,暂时没有发现此类问题

因为CDC的驱动是Microsoft提供的,从2000到XP兼容性应该不是什么问题

使用特权

评论回复
板凳
seawwh| | 2009-8-5 08:46 | 只看该作者
搂主: 我也遇到同样的问题,转换到XP就通信错误,好像包小的可以,包大一点比如512B就没有反应。
后来这个问题有解决办法了吗?

使用特权

评论回复
地板
mohanwei| | 2009-8-5 09:11 | 只看该作者
用一个专用线程查询串口接收缓冲区,有数马上读出来,丢到外面一个巨大的环形缓冲区。
界面线程有空查一下就行了。
网上的例程基本都是收到数,马上将对话框的数读出放到一个CString里,然后加上收到的数,最后更新对话框……对付小批量数据还凑合

使用特权

评论回复
5
tomzxq| | 2009-8-5 09:38 | 只看该作者
我也是刚开始用虚拟的串口,也发现经常会自己停掉,特别是收发同时进行的时候。香版主说,这个串口例程是单字节处理的,只是给演示用,特殊应用到自己修改

使用特权

评论回复
6
seawwh| | 2009-8-5 12:07 | 只看该作者
好像不是接收方面来不及的问题,我试了一下如果在USB发送的每64B之间加上20ms的延时也没有
效果。 根据楼主的试验,如果4KB大的数据块,为何传送OK呢?,说明XP系统确实没有丢数据,只是没有发消息给应用程序。

  按照楼主的办法,将每次数据改为62B, 在XP下面可以收到了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

427

主题

458

帖子

4

粉丝