我写了一个串口发送数据的函数,可是不知道为什么总是不行,高手一定帮帮忙啊!
代码如下:CFile CommFile;
HANDLE m_hComm=NULL;
void senddata()
{
if(m_hComm != NULL)
{
CloseHandle(m_hComm);
}
m_hComm = CreateFile(
"COM2",
GENERIC_READ | GENERIC_WRITE, 
0, 
NULL, 
OPEN_EXISTING, 
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 
NULL 
); if (m_hComm == NULL)
{
AfxMessageBox("open error!");
return;
}
DCB mDCB;
GetCommState(m_hComm,&mDCB);
mDCB.BaudRate = 9600;
mDCB.fBinary = TRUE;
mDCB.ByteSize = 8;
mDCB.Parity = 2;
mDCB.StopBits = 0;
mDCB.fParity = 1;
if (!SetCommState(m_hComm,&mDCB))
{
AfxMessageBox("set error!");
return;
}
COMMTIMEOUTS CommTimeouts; 
CommTimeouts.ReadIntervalTimeout = 0xFFFFFFFF ;
    CommTimeouts.ReadTotalTimeoutMultiplier = 500 ;
    CommTimeouts.ReadTotalTimeoutConstant = 5000 ;
    CommTimeouts.WriteTotalTimeoutMultiplier = 500;
    CommTimeouts.WriteTotalTimeoutConstant = 5000 ;
    if (!SetCommTimeouts(m_hComm, &CommTimeouts ))
{
AfxMessageBox("set timeouts error!");
return;
} OVERLAPPED mOverLapped;
DWORD mWritedNum = 0;
BOOL bState;
unsigned char msg[5]={0x10,0x40,0x01,0x41,0x16};
mOverLapped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
if(mOverLapped.hEvent == NULL)
{
AfxMessageBox("Create Event error!");
return;
}
bState = WriteFile(m_hComm,&msg,(DWORD)5,&mWritedNum,&mOverLapped);
if(!bState)
{
DWORD dwError;
dwError = GetLastError();
if ( dwError == ERROR_IO_PENDING ) 
{
GetOverlappedResult(m_hComm,&mOverLapped,&mWritedNum,TRUE);// 等待
}
}
return;
}可是怎么也发不出去,而且我扑捉到的GetLastError() = 0x57,而ERROR_IO_PENDING = 0x17,这是怎么回事啊?

解决方案 »

  1.   

    ERROR_IO_PENDING 串口正在被其他程序打开使用你的程序是不是结束的时候没有关闭串口呀Closehandle(m_hComm);
      

  2.   

    把分全给我吧,这两个错误是串口通讯中的标准错误,是因为要写入的数据没有准备好而写入造成的,只要将这两个错误忽略即可!参见:CSerailPort类。
      

  3.   

    而且我扑捉到的GetLastError() = 0x57,而ERROR_IO_PENDING = 0x17,0x57 == 参数不正确。 
    0x17 == 数据错误(循环冗余检查)。 
      

  4.   

    我知道是怎么回师了。
    应该在mOverLapped.hEvent = CreateEvent(..);前加一句:
    memset( &mOverLapped, 0, sizeof( OVERLAPPED ) );
    这样就可以了。呵呵,不管怎么说,都要谢谢楼上几位,大家都有分!