WINAPI串口发送不了数据
清风水岸 2009-08-22 10:20:25 程序为基于对话框的程序,使用WINAPI作为串口操作方式。查过很多资料,但是还是没搞清楚到底哪个地方出问题了,特发江湖救急令,希望各位多多帮助。具体串口部分代码如下:
串口初始化:
m_bConnected=FALSE;
m_pThread=NULL;
m_nBaud = 9600;
m_nDataBits = 8;
m_nParity = 0;
m_sPort = "COM1";
m_nStopBits = 0;
在OnInitDlg中初始化相关事件:
//为WM_COMMNOTIFY消息创建事件对象,手工重置,初始化为有信号的
if((m_hPostMsgEvent=CreateEvent(NULL, TRUE, TRUE, NULL))==NULL)
return FALSE;
//初始化读写Overlapped对象
memset(&m_osRead, 0, sizeof(OVERLAPPED));
memset(&m_osWrite, 0, sizeof(OVERLAPPED));
if((m_osRead.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)
return FALSE;
if((m_osWrite.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)
return FALSE;
串口监听线程:
UINT CommProc(LPVOID pParam)
{
OVERLAPPED os;
DWORD dwMask, dwTrans;
COMSTAT ComStat;
DWORD dwErrorFlags;
memset(&os, 0, sizeof(OVERLAPPED));
CDAConvertDlg *pDlg=(CDAConvertDlg*)pParam;
os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);
if(os.hEvent==NULL)
{
AfxMessageBox("Can't create event object!");
return (UINT)-1;
}
while(pDlg->m_bConnected)
{
ClearCommError(pDlg->m_hCom,&dwErrorFlags,&ComStat);
if(ComStat.cbInQue)
{
// ÎÞÏ޵ȴýWM_COMMNOTIFYÏûÏ¢±»´¦ÀíÍê
WaitForSingleObject(pDlg->m_hPostMsgEvent, INFINITE);
ResetEvent(pDlg->m_hPostMsgEvent);
//֪ͨÖ÷´°¿Ú
PostMessage(pDlg->m_hWnd,WM_COMMNOTIFY,EV_RXCHAR,0);
continue;
}
dwMask=0;
if(!WaitCommEvent(pDlg->m_hCom, &dwMask, &os)) // Öصþ²Ù×÷
{
if(GetLastError()==ERROR_IO_PENDING)
// ÎÞÏ޵ȴýÖصþ²Ù×÷½á¹û
GetOverlappedResult(pDlg->m_hCom, &os, &dwTrans, TRUE);
else
{
CloseHandle(os.hEvent);
return (UINT)-1;
}
}
}
CloseHandle(os.hEvent);
return 0;
}
串口打开:
BOOL CDAConvertDlg::OpenConnection()
{
COMMTIMEOUTS TimeOuts;
m_hTermWnd=GetSafeHwnd();
if(m_bConnected)
{
return FALSE;
}
m_hCom=CreateFile(m_sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL);
if(m_hCom==INVALID_HANDLE_VALUE)
return FALSE;
SetupComm(m_hCom,MAXBLOCK,MAXBLOCK);
SetCommMask(m_hCom, EV_RXCHAR);
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
TimeOuts.WriteTotalTimeoutMultiplier=50;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(m_hCom, &TimeOuts);
if(ConfigConnection())
{
m_pThread=AfxBeginThread(CommProc, this, THREAD_PRIORITY_NORMAL,
0, CREATE_SUSPENDED, NULL);
if(m_pThread==NULL)
{
CloseHandle(m_hCom);
return FALSE;
}
else
{
m_bConnected=TRUE;
m_pThread->ResumeThread();
}
}
else
{
CloseHandle(m_hCom);
return FALSE;
}
return TRUE;
}
写串口:
DWORD CDAConvertDlg::WriteComm(char *buf, DWORD dwLength)
{
BOOL fState;
DWORD length=dwLength;
COMSTAT ComStat;
DWORD dwErrorFlags;
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
fState=WriteFile(m_hCom,buf,length,&length,&m_osWrite);
if(!fState)
{
if(GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(m_hCom,&m_osWrite,&length,TRUE);// µÈ´ý
}
else
length=0;
}
return length;
}