当前位置: 代码迷 >> WinCE >> 串口输入输出缓冲区有关问题
  详细解决方案

串口输入输出缓冲区有关问题

热度:397   发布时间:2016-04-28 13:51:50.0
串口输入输出缓冲区问题?
我原来对串口通信有点了解,但最近对输入输出缓冲区有点糊涂了,希望理解深一点的朋友能解释下面两个问题:
1、输入输出缓冲区大小值怎么确定?比如我用SetupComm设置输入缓冲区为1个Byte,那我ReadFile是否不能超过1个字节?但我简单测试了一下,似乎可以正常接收?
2、输入输出缓冲区溢出具体怎么理解呢?我用的ARM开发板内存有64MB,一般应该不会发生溢出吧?但我试图接收32KB字节总是无法接收成功,我已经对数据进行整合链接了,接收几百个字节没有问题,但接收32KB似乎不能成功,请问这可能是输入输出缓冲区溢出引起的吗?我缓冲区大小已经设置为32KB了!
  谢谢!

------解决方案--------------------
串口从硬件角度,有自己的输入输出缓存(FIFO).这个一般都不大,是固定的,也就是几个字节。

从驱动和操作系统层面,可能会有软件缓存?

不知道你说的是哪个层面
------解决方案--------------------
缓冲区是在你来不及处理数据的时候保留数据的一块内存,其大小应该根据你的数据传输速率和处理数据的能力大小来设置。如果一直来不及处理数据,又没有合适的纠错方法,就会导致数据丢失。
SetupComm在WINCE驱动下面好像是没有实现的,没什么作用
第二个问题是不是跟程序的其他地方有冲突啊?

------解决方案--------------------
我觉得是这样:

1
SetupComm设置的缓存是串口驱动里面使用的缓存buffer大小,本意是驱动根据dwInQueue 和dwOutQueue两个数值动态申请缓存串口数据的内存。和硬件FIFO没有联系。


由SetupComm函数设置的dwInQueue 和 dwOutQueue,只是给串口驱动传递一个推荐值,并不一定就会被驱动完全采纳,要看串口驱动开发人员的具体实现。我现在手上有一份BSP,它的串口驱动里面就忽略了这个函数所设置的dwInQueue 和 dwOutQueue。


大块的数据,可以分小块多次读取。
------解决方案--------------------
都是相互学习~~
我在想第二个问题是不是因为数据量太大,在下一次发送前没有处理完,或者接收超时了?
探讨

TO 3 楼:谢谢你的回答。
这样说缓冲区大小不会跟你接收的数据直接相关了。也就是说你即使要接收32KB数据大小,你的缓冲区仍然可设置为1KB,这只要在接下来的1KB数据来之前处理完原来的1KB数据即可!应该是这样理解的!
  相关解决方案