有关串口通信? 我现在对一个串口进行读写,串口连着GSM模块,当收数据时,有时是收到数据的一半就返回,不能保证收完数据之才返回,这是为什么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是这样的: 我采用的是API函数,代码如下, 1>. 可是我ReadFile 返回的数据不能保证是完整的: 如,本来要收到的数据是"+CMTI: "SM", 11", 可有时分两次才能收到这数据,第一次收到的是"+CMTI:", 第二次收到的"SM", 11"请问这是怎么回事,我怎样才能确保一次收到完整的数据? 2>. ReadFile返回的值怎么总是为 TRUE ,如果出现上面请况,相当于没有收完数据,应该返回为FALSE 的, 这又是为什么? 打开方式:hCom=CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);UINT CommProc(LPVOID pParam){ OVERLAPPED os; DWORD dwMask; DWORD dwErrorFlags; memset(&os, 0, sizeof(OVERLAPPED)); os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL); if(os.hEvent==NULL) { return (UINT)-1; } while(bConnected) { dwMask=0; WaitCommEvent( hCom, &dwMask, &os); if( (dwMask & EV_RXCHAR ) == EV_RXCHAR)// 缓冲区中有数据到达 { COMSTAT ComStat; ClearCommError( hCom, &dwErrorFlags, &ComStat ); if( ComStat.cbInQue > 0) //输入缓冲区有多少数据? { char buf[MAXBLOCK] = ""; DWORD length = 0; BOOL bReadStat ; bReadStat = ReadFile( hCom, buf, MAXBLOCK, &length, &pComEntry->osRead); //读数据 if (!bReadStat) { if (GetLastError() == ERROR_IO_PENDING) { while( !GetOverlappedResult( hCom, &os, &length, TRUE)) { DWORD dwError = GetLastError(); if( dwError == ERROR_IO_INCOMPLETE) continue; // 缓冲区数据没有读完,继续 //分析收到的数据 InfoProcess( buf ); } } } else { InfoProcess( pComEntry, buf ); } } } } CloseHandle(os.hEvent); return 0;}感谢 关心这个问题的所有朋友, 谢谢 ! 请问下,MFC中,什么时候先调用父类的函数喃?具体的请见内容,谢谢! 来个小调查,哪些朋友是初一回家的 奇怪的问题!请教大侠们! jmail发送邮件的问题 请问一下关于interface用法, 是怎么用的啊,不明白?谢谢大家 本人有一套GPS定位系统网络版软件出售(含源代码) 看看这是什么引起的错误 一个有关网络上收发字符串的问题!! 如何将结构体从字符缓冲区中正确取出 请问串口DCB的EofChar怎么用?有答对者再加分。 想获取对话框的句柄,并触发IDOK的响应函数,咋办? help~!help~~~!!!
我采用的是API函数,代码如下,
1>. 可是我ReadFile 返回的数据不能保证是完整的: 如,本来要收到的数据是"+CMTI: "SM", 11", 可有时分两次才能收到这数据,第一次收到的是"+CMTI:", 第二次收到的"SM", 11"请问这是怎么回事,我怎样才能确保一次收到完整的数据?
2>. ReadFile返回的值怎么总是为 TRUE ,如果出现上面请况,相当于没有收完数据,应该返回为FALSE 的, 这又是为什么?
打开方式:
hCom=CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL);
UINT CommProc(LPVOID pParam)
{
OVERLAPPED os;
DWORD dwMask;
DWORD dwErrorFlags; memset(&os, 0, sizeof(OVERLAPPED));
os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);
if(os.hEvent==NULL)
{
return (UINT)-1;
}
while(bConnected)
{
dwMask=0;
WaitCommEvent( hCom, &dwMask, &os);
if( (dwMask & EV_RXCHAR ) == EV_RXCHAR)// 缓冲区中有数据到达
{
COMSTAT ComStat;
ClearCommError( hCom, &dwErrorFlags, &ComStat );
if( ComStat.cbInQue > 0) //输入缓冲区有多少数据?
{
char buf[MAXBLOCK] = "";
DWORD length = 0;
BOOL bReadStat ;
bReadStat = ReadFile( hCom, buf, MAXBLOCK, &length, &pComEntry->osRead); //读数据
if (!bReadStat)
{
if (GetLastError() == ERROR_IO_PENDING)
{
while( !GetOverlappedResult( hCom, &os, &length, TRUE))
{
DWORD dwError = GetLastError();
if( dwError == ERROR_IO_INCOMPLETE)
continue; // 缓冲区数据没有读完,继续
//分析收到的数据
InfoProcess( buf );
}
}
}
else
{
InfoProcess( pComEntry, buf );
}
}
}
}
CloseHandle(os.hEvent);
return 0;
}
感谢 关心这个问题的所有朋友, 谢谢 !