DWORD CSerial::WritePort(TCHAR *buf,DWORD dwCharToWrite)
{
BOOL fWriteState;
DWORD dwBytesWritten;
//写入数据
fWriteState=WriteFile(hPort,buf,dwCharToWrite*sizeof(TCHAR),&dwBytesWritten,NULL);
if(!fWriteState)
{
//不能写数据
MessageBox(NULL,TEXT("Can't Write String to Comm"),TEXT("Error"),MB_OK);
dwBytesWritten=0;
}
return dwBytesWritten;
}
DWORD WINAPI ReadPortThread(LPVOID lpvoid)
{
BOOL fReadState;
DWORD dwCommModemStatus;
DWORD dwLength;
COMSTAT ComStat;
DWORD dwErrorFlags;
while (hPort != INVALID_HANDLE_VALUE)
{
//等待串口的事件发生
WaitCommEvent (hPort, &dwCommModemStatus, 0);
if (dwCommModemStatus & EV_RXCHAR)
{
ClearCommError(hPort,&dwErrorFlags,&ComStat);
//cbInQue返回在串行驱动程序输入队列中的字符数
dwLength=ComStat.cbInQue;
if(dwLength>0)
{
//从串口读取数据
TCHAR* buf=new TCHAR[256];
fReadState=ReadFile(hPort,buf,dwLength,&dwLength,NULL);
if(!fReadState)
{
//不能从串口读取数据
MessageBox(NULL,TEXT("Error in read from serial port"),TEXT("Read Error"),MB_OK);
}
else
{
//把数据赋值给全局变量
strInChar=buf;
}
delete[] buf;
}
}
GetCommModemStatus (hPort, &dwCommModemStatus);
}
return 0;
}
BOOL CSerial::ClosePort(HANDLE hCommPort)
{
if (hCommPort != INVALID_HANDLE_VALUE)
{
//设置连接属性为FALSE
m_bConnected=FALSE;
//结束线程中WaitCommEvent的等待
SetCommMask(hPort,0);
//阻塞至线程停止
if(hReadThread)
{
TerminateThread(hReadThread,0);
CloseHandle(hReadThread);
}
//清除端口上指定信号的状态
EscapeCommFunction(hPort,CLRDTR);
EscapeCommFunction(hPort,CLRRTS);
//清除驱动程序内部的发送和接收队列
PurgeComm(hPort,PURGE_TXCLEAR|PURGE_RXCLEAR);
//关闭串口
CloseHandle (hCommPort);
hCommPort = INVALID_HANDLE_VALUE;
return TRUE;
}
else
{
return TRUE;
}
}