(WinAPI)串口通信丢包啊!!求解!!(有码有真相!)

cjb734120250 2011-05-10 09:44:59
用WinAPI写了个串口通信的程序 但发送数据时丢包很严重啊!找了好久都不知道为什么···

这是串口初始化的程序:
hCom = CreateFile(FliName,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL
);


if(hCom == INVALID_HANDLE_VALUE)
{
return false;
}

SetupComm(hCom, 4048, 4048);

COMMTIMEOUTS TimeOut;
TimeOut.ReadIntervalTimeout = 20; //任意相邻连个字符之间的超时设置
TimeOut.ReadTotalTimeoutConstant = 30; //读操作总的超时时间的修正常量
TimeOut.ReadTotalTimeoutMultiplier = 100; //读操作总的超时时间的系数
TimeOut.WriteTotalTimeoutConstant = 500; //写操作总的超时时间的修正常量
TimeOut.WriteTotalTimeoutMultiplier = 510; //写操作总的超时时间的系数

SetCommTimeouts(hCom, &TimeOut);//设置超时

DCB dcb;

GetCommState(hCom, &dcb);
dcb.BaudRate = CBR_9600; //波特率
dcb.ByteSize = 8; // number of bits/byte, 4-8 指定端口当前使用的数据位
dcb.Parity = NOPARITY; // 0-4=no,odd,even,mark,space 指定端口当前使用的奇偶校验方法
dcb.StopBits = TWOSTOPBITS; //指定端口当前使用的停止位数
SetCommState(hCom,&dcb);

PurgeComm(hCom, PURGE_TXCLEAR|PURGE_RXCLEAR);


这是接收数据的代码:

OVERLAPPED osRead;
memset(&osRead, 0, sizeof(OVERLAPPED));
osRead.hEvent = CreateEvent(0, true, false, 0);

COMSTAT ComStat;
DWORD dwErrorFlags;

DWORD dwBytesRead = sizeof(szReceive);

BOOL bReadStat;

ClearCommError(_hComReceive, &dwErrorFlags, &ComStat);
dwBytesRead = min(dwBytesRead, (DWORD)ComStat.cbInQue);

if(!dwBytesRead)
{
CloseHandle(osRead.hEvent);
return false;
}

bReadStat = ReadFile(_hComReceive, szReceive, dwBytesRead, &dwBytesRead, &osRead);

if(!bReadStat)
{
if(GetLastError() == ERROR_IO_PENDING)
{
WaitForSingleObject(osRead.hEvent, INFINITE);
}
}
PurgeComm(_hComReceive, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXCLEAR);

这是发送数据的代码:
OVERLAPPED osWrite;
memset(&osWrite, 0, sizeof(OVERLAPPED));
osWrite.hEvent = CreateEvent(0, true, false, 0);
if(osWrite.hEvent == INVALID_HANDLE_VALUE)
{
AfxMessageBox("发送 CreateEvent() error");
CloseHandle(osWrite.hEvent);
return ;
}

DWORD dwBytesWrite = sizeof(szReceive);
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;

ClearCommError(_hComSend, &dwErrorFlags, &ComStat);
bWriteStat = WriteFile(_hComSend, szReceive, dwBytesWrite, &dwBytesWrite, &osWrite);
//Sleep(30);



if(!bWriteStat)
{
if(GetLastError() == ERROR_IO_PENDING)
{
WaitForSingleObject(osWrite.hEvent, 30);
}
}

CloseHandle(osWrite.hEvent);


我用串口通信助手试过了 电脑没问题,接收时也挺正常,就是发送时会丢包! 200ms发一次不会丢包 但是小于200ms的话就会丢包了 多线程我也用了,但还是一样 代码不够的话我再贴,各位帮帮忙吧··
...全文
324 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
悟迟 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cjb734120250 的回复:]

帮忙顶下
要结贴了
随便顶吧
[/Quote]
给力
老邓 2011-05-23
  • 打赏
  • 举报
回复
Windows下异步应该有事件机制的。
具体查下MSDN吧,我没写过异步的,只写过同步的。
老邓 2011-05-23
  • 打赏
  • 举报
回复
先获取串口状态,再循环读取。
我在单片机下没多线程可用,只能在定时器中检测。
不知道你的问题是出在哪个平台。
jernymy 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cjb734120250 的回复:]
帮忙顶下
要结贴了
随便顶吧
[/Quote]

先顶一下


ryfdizuo 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cjb734120250 的回复:]

帮忙顶下
要结贴了
随便顶吧
[/Quote]
问题解决了?
cjb734120250 2011-05-23
  • 打赏
  • 举报
回复
帮忙顶下
要结贴了
随便顶吧
cjb734120250 2011-05-23
  • 打赏
  • 举报
回复
果然给力 不说不来 一说就红水般的涌上来了
eye_119_eye 2011-05-23
  • 打赏
  • 举报
回复
学习 看看 异步
linvim 2011-05-23
  • 打赏
  • 举报
回复
我只是来顶贴的
luciferisnotsatan 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 cjb734120250 的回复:]
用WinAPI写了个串口通信的程序 但发送数据时丢包很严重啊!找了好久都不知道为什么···

这是串口初始化的程序:
hCom = CreateFile(FliName,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NU……
[/Quote]
解决了?接分
xspace_time 2011-05-23
  • 打赏
  • 举报
回复
重点句是
So, if ReadFile returns TRUE, but fewer bytes were read than were requested, the operation timed out
因为读取的比要求的少,所以返回空包
xspace_time 2011-05-23
  • 打赏
  • 举报
回复
虽然百度里多处提及同一问题,我还是在MSDN里找到了一段能够说明这个问题是如何产生的说明,哪位来给翻译下
The only way to tell that the operation timed out is that the number of bytes actually transferred are fewer than the number of bytes requested. So, if ReadFile returns TRUE, but fewer bytes were read than were requested, the operation timed out. If an overlapped write operation times out, the overlapped event handle is signaled and WaitForSingleObject returns WAIT_OBJECT_O. GetOverlappedResult returns TRUE, but dwBytesTransferred contains the number of bytes that were transferred before the time-out.

64,701

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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