串口通讯接收时数据丢失?

choupipi 2003-12-15 10:28:35
在波特率115200下、接收对方0.01秒间隔发送的数据(数据大约30字节),发现接收到的数据丢失的很厉害(只收到约30%多)。接收是如下方式的:
HANDLE h = CreateEvent(NULL,TRUE,FALSE,NULL);
while (true)
{
memset(&o,0,sizeof(o));
o.hEvent = h;
if (WaitCommEvent(hComm, &flag, &o))
{
}
WaitForSingleObject(o.hEvent,INFINITE); //5000
ClearCommError(hComm,&dwErr,&comstat);
size = comstat.cbInQue;
if (size == 0)
return 0;
if(!ReadFile(hComm,&data[index],size,&dw, &o))
{
GetOverlappedResult(hComm,&o,&dw,TRUE);
ResetEvent(o.hEvent);
CloseHandle(o.hEvent);
//index++;
}
else
index+=dw; //读到指定的内容
if (dw > 0) break;
ResetEvent(o.hEvent);
}
CloseHandle(o.hEvent);
因为发送方不是我写的,无法使用流控,请问大家有什么方法可以解决?
...全文
1270 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
choupipi 2003-12-16
  • 打赏
  • 举报
回复
谢谢大家了,我想我还是改一下程序的接收结构。分少,别介意
黄双全 2003-12-16
  • 打赏
  • 举报
回复
有没有试过CSerialPort类,你上网去找找,找不到的话留个mail,我发给你
zdleek 2003-12-16
  • 打赏
  • 举报
回复
忘了说了,我用的是微软的串口通信控件mscomm
zdleek 2003-12-16
  • 打赏
  • 举报
回复
我最近刚做的一个程序,串口通信,115200的波特率,间隔0.015秒发送数据(一次最大256bytes),起初也有丢失数据,后来换了一条串口线就好了,你看看是否也有同样问题
choupipi 2003-12-16
  • 打赏
  • 举报
回复
目前我程序的接收速度大概是3.17 bytes/ms,如果对方发的速度超过这,就会丢失数据了。 大家看能从什么方面再提高一点吗?感谢。。。。
choupipi 2003-12-15
  • 打赏
  • 举报
回复
大家有优化的方法吗?有些着急了:)
choupipi 2003-12-15
  • 打赏
  • 举报
回复
牵扯到第三方,波特率是没法降的。对方反映丢失数据,0.01秒的间隔是我测试的,如果是0.1秒,则不会丢失数据。
jian 2003-12-15
  • 打赏
  • 举报
回复

100×30×8=24000
你的波特率115200比较大,对硬件的要求高一些,而且对传输有相当的冗余,是否考虑将波特率该小一些。对双方的读写时序要求低些,准确性可能会有提高。
zjg751206 2003-12-15
  • 打赏
  • 举报
回复
BOOL bRead = TRUE;
BOOL bResult = TRUE;
DWORD dwError = 0;
DWORD BytesRead = 0;
unsigned char RXBuff; //串口通讯设备文件读如数据存储缓冲单元。(一次只读一个字符)

for(;;) //串口通讯设备读数据循环(死循环)
{
//进入临界区。
EnterCriticalSection(&port->m_csCommunicationSync);
//ClearCommError()函数将修改COMSTAT结构和清除其他错误。
bResult = ClearCommError(port->m_hComm, &dwError, &comstat);
//退出临界区。
LeaveCriticalSection(&port->m_csCommunicationSync);

//如果接收队列空,则退出读取(接收)数据循环。
if(comstat.cbInQue==0) break;

//再次进入临界区。
EnterCriticalSection(&port->m_csCommunicationSync);
if(bRead)
{
//读串口通讯设备文件。
bResult=ReadFile(port->m_hComm, //串口通讯设备文件句柄。
&RXBuff, //接收数据的缓冲区指针。
1, //指定要从文件中读取的字节数。
&BytesRead, //返回本次操作实际读入的字节数。
&port->m_ov); // pointer to the m_ov structure
if(!bResult) //读数据失败
{
switch(dwError=GetLastError())
{ //根据读数据错误码进行处理。
case ERROR_IO_PENDING:
{
// asynchronous i/o is still in progress
// Proceed on to GetOverlappedResults();
bRead = FALSE;
break;
}
default:
{
// Another error has occured. Process this error.
port->ProcessErrorMessage("ReadFile()");
break;
}
}
}
else //读数据正确。
bRead = TRUE;
}

if(!bRead) //读数据不正确。
{
bRead=TRUE;
//取得最后的操作错误结果。
bResult=GetOverlappedResult(port->m_hComm, //串口通讯设备文件句柄。
&port->m_ov, // Overlapped 结构。
&BytesRead, //返回该操作的字节数。
TRUE); //操作是否仍在进行中。
//失败。
if(!bResult) port->ProcessErrorMessage("GetOverlappedResults() in ReadFile()");
}
//离开临界区。
LeaveCriticalSection(&port->m_csCommunicationSync);

//向〈父窗口〉发送接收一个字符消息, 串口接收字符消息,接收的字符数据, 串口号。
::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_RXCHAR, (WPARAM)RXBuff, (LPARAM)port->m_nPortNr);
}//结束死循环


我这么写的。从来没有出过任何差错。与波特率关系不大。关键是代码不能有漏洞
choupipi 2003-12-15
  • 打赏
  • 举报
回复
能用我当然用了!读大批量数据,是不是轮询会比事件的效果好些?
snollow 2003-12-15
  • 打赏
  • 举报
回复
可以考虑用usb口撒
choupipi 2003-12-15
  • 打赏
  • 举报
回复
按楼上的说法试了,没有显著效果啊
sxslyy 2003-12-15
  • 打赏
  • 举报
回复
一次接收一个字节最后再连起来.

再读之前Sleep一下.

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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