串口输入输出缓冲区问题?

zzf19870622 2011-12-12 10:33:09
我原来对串口通信有点了解,但最近对输入输出缓冲区有点糊涂了,希望理解深一点的朋友能解释下面两个问题:
1、输入输出缓冲区大小值怎么确定?比如我用SetupComm设置输入缓冲区为1个Byte,那我ReadFile是否不能超过1个字节?但我简单测试了一下,似乎可以正常接收?
2、输入输出缓冲区溢出具体怎么理解呢?我用的ARM开发板内存有64MB,一般应该不会发生溢出吧?但我试图接收32KB字节总是无法接收成功,我已经对数据进行整合链接了,接收几百个字节没有问题,但接收32KB似乎不能成功,请问这可能是输入输出缓冲区溢出引起的吗?我缓冲区大小已经设置为32KB了!
谢谢!
...全文
1028 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yhp1888 2011-12-12
  • 打赏
  • 举报
回复
本人的经历是:SetupComm在WINCE驱动下面好像是没有实现的,没什么作用

onelove2009 2011-12-12
  • 打赏
  • 举报
回复
都是相互学习~~
我在想第二个问题是不是因为数据量太大,在下一次发送前没有处理完,或者接收超时了?
[Quote=引用 4 楼 zzf19870622 的回复:]

TO 3 楼:谢谢你的回答。
这样说缓冲区大小不会跟你接收的数据直接相关了。也就是说你即使要接收32KB数据大小,你的缓冲区仍然可设置为1KB,这只要在接下来的1KB数据来之前处理完原来的1KB数据即可!应该是这样理解的!
[/Quote]
northcan 2011-12-12
  • 打赏
  • 举报
回复
我觉得是这样:

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

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

3
大块的数据,可以分小块多次读取。
zzf19870622 2011-12-12
  • 打赏
  • 举报
回复
TO 3 楼:谢谢你的回答。
这样说缓冲区大小不会跟你接收的数据直接相关了。也就是说你即使要接收32KB数据大小,你的缓冲区仍然可设置为1KB,这只要在接下来的1KB数据来之前处理完原来的1KB数据即可!应该是这样理解的!
onelove2009 2011-12-12
  • 打赏
  • 举报
回复
缓冲区是在你来不及处理数据的时候保留数据的一块内存,其大小应该根据你的数据传输速率和处理数据的能力大小来设置。如果一直来不及处理数据,又没有合适的纠错方法,就会导致数据丢失。
SetupComm在WINCE驱动下面好像是没有实现的,没什么作用
第二个问题是不是跟程序的其他地方有冲突啊?
zzf19870622 2011-12-12
  • 打赏
  • 举报
回复
回复1楼,应该指的是软件缓存,因为我是做应用层开发程序,一般要自己先设置一下软件的缓冲区!
zhenghn2010 2011-12-12
  • 打赏
  • 举报
回复
串口从硬件角度,有自己的输入输出缓存(FIFO).这个一般都不大,是固定的,也就是几个字节。

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

不知道你说的是哪个层面
PComm 库函数 PComm 库函数是台湾MOXA公司提供的,他为用户提供了基于win32 api的开发接口。 PComm库函数分为7大类 控制函数、数据输入函数、数据输出函数、状态函数、事件驱动函数、传输文件函数、特殊设定函数 上述函数均返回int型数据,若函数调用成功则返回0,否则返回一个负整数。 控制函数主要包括 sio_open(PortNum) 打开串口 sio_close(PortNum) 关闭串口 sio_ioctl(PortNum, baud, mode)设置串口的工作模式,包括 波特率,数据位元,停止位,效验等 sio_flush(portNum,func)清除发送、接收缓冲区 其中func 为0清空输入 ,为1清空输出,为2清空输入输出 sio_SetWriteTimeouts(int port,DWORD TotalTimeouts):设置串口写操作的超时。 sio_lctrl(Portnum,mode) 设置串口RTS/DTS。 待定 数据输入函数主要包括 sio_getch(PortNum) 从输入缓冲区读一个字符 sio_read(PortNum,buf,len) 从输入缓冲区读指定个数的字符 sio_iqueue(Portnum)读取输入缓冲区中的字符长度 数据输出函数主要包括 sio_putch(PortNum) 写一个字符到输出缓冲区 sio_write(PortNum,buf,len)写指定个数的字符到输出缓冲区 状态函数主要包括 sio_lstatus(portNum)获取串口的CTS,DSR,DCD,RI线的状态 sio_getbaud(portNum)获取串口的波特率 sio_getmode(portNum)获取串口的工作模式。对应sio_ioct函数 事件函数主要包括 sio_term_irq(portNum,func,code) 当接收到指定字符时响应事件,func为回调函数名,code为指定的字符 sio_cnt_irq(PortNum,func,count) 当接收到指定个数字元时响应事件,func为回调函数名,count接收的个数 传输文件函数主要包括 sio_FtASCIITx(portNum,fname,func,key)发送一个文本文件 sio_FtASCIIRx(portNum,fname,func,Key,sec)接收一个文本文件 int i,Ret,DataLen; FILE *fp1; uchar RetDataC[30],WriteData[24],PSC[5]; Ret = sio_open(port); if (Ret != SIO_OK ) return(-1);//打开串口错误 Ret = sio_ioctl (port, B9600, P_NONE | BIT_8 | STOP_1 ); if (Ret != SIO_OK) { sio_close(port); return(-2);//设置串口参数失败 } /*Ret = sio_lctrl (port, C_DTR | C_RTS ); if (Ret != SIO_OK) { sio_close(port); return(-2);//设置串口参数失败 }*/ /*Ret = sio_flush(port,2); if (Ret != SIO_OK){ sio_close(port); return(-3);//清空 输入和输出缓冲区的数据 }*/

19,500

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧