串口接收端SetupComm(m_hComm, 2000, 2000),然后发送端一次发送3000,怎么接收?

ocean1004 2010-07-19 02:15:40
用的是 网上流传挺广的CSerialPort类
这里有例子下载:http://www.daxia.com/bibis/upload/serialport_demo.93.zip


CSerialPort类是异步的串口通信,以下是一些关键代码:
OVERLAPPED m_ov;
m_hComm=CreateFile(FILE_FLAG_OVERLAPPED);

//设置超时
m_CommTimeouts.ReadIntervalTimeout = 1000;
m_CommTimeouts.ReadTotalTimeoutMultiplier = 1000;
m_CommTimeouts.ReadTotalTimeoutConstant = 1000;
m_CommTimeouts.WriteTotalTimeoutMultiplier = 1000;
m_CommTimeouts.WriteTotalTimeoutConstant = 1000;
SetCommTimeouts(m_hComm, &m_CommTimeouts)
//设置缓冲区大小
SetupComm(m_hComm, 2000, 2000)

//启动线程接收
while(1)
{
WaitCommEvent(m_hComm, &Event, m_ov);//等待串口事件
WaitForObject(m_ov);//等待 重叠端口 事件
for(;;)
{
bResult = ClearCommError(m_hComm, &dwError, &comstat);
if (comstat.cbInQue == 0)
{
break;
}
ReadFile(buf, 1, m_ov);//读取,每次都是1个1个字节读取
}
}


当发送端一次性发送3000字节的时候,接收端触发了一次接收事件(EV_RXCHAR),for(;;)也只进入一次,然后把2000字节读出来,也就是接收了2000字节,然后就没再一次到来消息了。停在了
WaitForObject(m_ov);//等待 重叠端口 事件
这里。当把缓冲区大小设置为2500的时候,也是同样的情况,接收了2500,没有再继续下去。


第一次做串口通信,没经验。不知道这样描述算不算清除了。
...全文
965 点赞 收藏 12
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mailqiangwei 2011-03-02
有没有介绍相关函数SetupComm的文档
回复
ocean1004 2010-07-29
[Quote=引用 10 楼 job82824 的回复:]

C/C++ code

for (;;)
{
EnterCriticalSection(&port->m_csCommunicationSync); //没有这个的话可能会出现冲突
if (bRead)
{
bResult = ReadFile(port->m_hComm,&RXBuff,1,&BytesRead,&……
[/Quote]
恩,慢很多。。。
但是现在的问题不在这儿。。。
回复
ocean1004 2010-07-28
[Quote=引用 8 楼 lfchen 的回复:]
// 你的下位机是应答式的还是连续式发送数据?
// 应答式的话,需要多大的缓冲区上位机是知道的。
[/Quote]
连续发送式的,我现在不得不把缓冲设置为7MB,因为下位机发送的最大数据长度是两个字节。
回复
job82824 2010-07-28

for (;;)
{
EnterCriticalSection(&port->m_csCommunicationSync); //没有这个的话可能会出现冲突
if (bRead)
{
bResult = ReadFile(port->m_hComm,&RXBuff,1,&BytesRead,&port->m_ov);
}
if (!bResult)//出错了
{
...//清除错误,然后进入下一次循环
}
LeaveCriticalSection(&port->m_csCommunicationSync);//离开
::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_RXCHAR, (WPARAM) RXBuff, (LPARAM) port->m_nPortNr);//这里我改动了下,每接收到一个字符RXBuff就发送一个中断

一个字符一个字符中断的话速度会慢一点儿
回复
ocean1004 2010-07-26
[Quote=引用 5 楼 lfchen 的回复:]

// 缓冲区不够大,数据丢了。
[/Quote]
缓冲区永远都是不够的啊。我已经设置了2K了,难道要设置2M?即使设置了2M,也是不够的啊。
回复
// 你的下位机是应答式的还是连续式发送数据?
// 应答式的话,需要多大的缓冲区上位机是知道的。
回复
// 那就是需要在通讯协议中增加握手协议;当上位机缓冲区快满的时候,下位机停止发送数据。
回复
// 缓冲区不够大,数据丢了。
回复
ocean1004 2010-07-21
??????????????????????????????
回复
ocean1004 2010-07-20
god damm
回复
ocean1004 2010-07-19
[Quote=引用 1 楼 liweisdut 的回复:]
在while之前应该先创建事件CreateEvent()
[/Quote]
。。。。。
问题应该在重叠端口使用
回复
liweisdut 2010-07-19
在while之前应该先创建事件CreateEvent()
回复
发动态
发帖子
硬件/系统
创建于2007-09-28

2589

社区成员

VC/MFC 硬件/系统
申请成为版主
社区公告
暂无公告