有同事问我如下问题:
我的答复:
串口发送数据字节是有先后次序的,前后到达的时间当然 不可能 一样..
由于线路原因,头几个字节到了,后几个字节可能要等100ms才能到.
一般程序用的是windows的串口控件 是有缓存的, 他默认判断一个数据包是否发完是根据前后连个字节之间接收间隔来定的.
加入一定时间内没有收到数据,windows 会把当前缓存里的数据当成一个完整的数据包,然后用消息通知主程序.
串口控件这种缓存的方法是有缺陷的:必须等时间间隔,假如线路干扰大,误码会比较多.
因此,最好由我们自己用API处理串口, 把串口当成文件进行操作,当检测到串口有数据写入时,
我们的程序自动读出数据,把数据加入自己的缓存....
要判断数据包是否结束,我们当时采用了如下方法: 每个包有固定包头,包头后跟数据包长度.收到包头和数据包长度之后,根据这个长度来读取剩下的数据.当数据数量达到了这个长度,表示包结束, 开始处理该数据包.
一次读取不完全,因为你中断了程序的运行,监视串口的线程调用
onreceive受阻被挂起.
(记录之,备忘)
柯工,我仿照你程序里的cncomm 和cport类写了一个小程序,
在接收数据时有个问题,当我发送过来很多数据需要一次接收时,发现好像总是一次接收不完。调试时发现第一次总是只接收到几个字节,然后才能一下接收很多个把剩余的接收完,为什么会这样呢?直接运行时可能并不是这样吗?不过在onreceive外设置断点测试每次read多少时,至少最后一次收的数据也只是几个字节,到底是什么机制啊
在onrecieve函数中这样:

最终是可以接收完所有数据的,但我就是不明白,它明明一次可以读很多数据,为什么第一次不肯读这么多呢?
串口一次最多可以读写多少数据?