请高手指点:串口数据接收不到!内含全部代码...
打开端口:
if( ( m_hCom = ::CreateFile(strCom,
GENERIC_WRITE|GENERIC_READ,
0, // exclusive access
NULL, // no security attrs
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,//
NULL
) ) == (HANDLE) -1 )
{
return -1; //Com Init Error
}
// setup device buffers
::SetupComm(m_hCom, 4096, 4096);
// purge any information in the buffer
//::PurgeComm(m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;这一句作用是什么?
EscapeCommFunction(m_hCom,SETDTR);
EscapeCommFunction(m_hCom,SETRTS);
// set up for overlapped I/O
COMMTIMEOUTS CommTimeOuts ;
CommTimeOuts.ReadIntervalTimeout = MAXDWORD ; //¶Á¼ä¸ô³¬Ê±(µ¥¸ö×Ö·ûÁ½¸ö×Ö·ûµÄ×î´óÑÓʱ
CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ; //¶Áʱ¼äϵÊý
CommTimeOuts.ReadTotalTimeoutConstant = 0 ; //¶Áʱ¼ä³£Á¿
CommTimeOuts.WriteTotalTimeoutMultiplier = 10 ; //дʱ¼äϵÊý
CommTimeOuts.WriteTotalTimeoutConstant = 1000 ; //дʱ¼ä³£Á¿
SetCommTimeouts(m_hCom, &CommTimeOuts ) ; //×ܳ¬Ê±£½ÏµÊý¡ÁÒªÇó¶ÁдµÄ×Ö·ûÊý£«Ê±¼ä³£Á¿
DCB dcb;
if (!GetCommState(m_hCom, &dcb))
{
CloseHandle(m_hCom);
return -1; //Com Init Error
}
dcb.BaudRate = CBR_19200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
if( !::SetCommState(m_hCom, &dcb) )
{
::CloseHandle(m_hCom);
return -1; //Com InitError
}
return 0;
写数据:
DWORD nBytesToWrite =0;
DWORD dwBytesWritten = 0;
CString strTmp=m_strSendMsg;//写入串口的数据
nBytesToWrite= strTmp.GetLength();
char *pszMessage = new char[nBytesToWrite + 1];
for(int i = 0; i<nBytesToWrite; i++)
pszMessage[i] = strTmp.GetAt(i);
pszMessage[i] = '\0';
if (!WriteFile(m_hCom, pszMessage, nBytesToWrite, &dwBytesWritten, NULL))
{
TRACE(_T("Write to COM Error:\n"));
delete [] pszMessage;//zhangzf
return FALSE;//zhangzf
}
delete [] pszMessage;
return TRUE;
读数据:
char cRcvBuf[MAX_RCV_LEN + 1];
DWORD dwRcvLen;
DWORD dwResult;
//::SetCommMask(m_hCom,EV_RXFLAG);加上这一句后程序将死在waitcommevent处!
DWORD dwCommModemStatus;
WaitCommEvent(m_hCom,&dwCommModemStatus,0);
//::SetCommMask(m_hCom,EV_RXFLAG);
if(dwCommModemStatus & EV_RXFLAG)//EV_RXCHAR
{
//Loop for waiting for the data
memset(cRcvBuf, 0, MAX_RCV_LEN + 1);
ReadFile(m_hCom,cRcvBuf,MAX_RCV_LEN,&dwRcvLen,NULL);
CString strTmp;
int strLen = dwRcvLen;
for(int i = 0; i<dwRcvLen; i++)
strTmp += (TCHAR)cRcvBuf[i];
m_strReceiveMsg=strTmp;//zhangzf
}
PurgeComm(m_hCom,PURGE_RXCLEAR);
return TRUE;
关闭端口:
if(m_hCom != INVALID_HANDLE_VALUE)
CloseHandle(m_hCom);
模拟器上单步调试,可以正常写入数据,但不能读出,永远不执行if(dwCommModemStatus & EV_RXFLAG)内的代码。是否SetCommMask函数的参数设置
不正确,请指点,谢谢!