CSerialPort SerialPort;
void CSerialPort::ReceiveChar(CSerialPort* port, COMSTAT comstat)
{
DWORD dwError = 0;
DWORD BytesRead = 0;
unsigned char RXBuff;
void* pRecDataPacket = NULL;
for (;;)
{
ReadFile(port->m_hComm,&RXBuff,1,&BytesRead,&port->m_ov);
if (pRecDataPacket = port->pRecCall((BYTE)RXBuff))
{
WaitForSingleObject((port->hSubsribe),INFINITE);
if (port->m_pOwner)
{
//TRACE("串口接收数据:\n");
::PostMessage((port->m_pOwner)->m_hWnd,WM_COMM_RXCHAR,(WPARAM)pRecDataPacket,(LPARAM)port->m_nPortNr);
}
else if (port->m_idThread)
{
PostThreadMessage(port->m_idThread,WM_COMM_RXCHAR,(WPARAM)pRecDataPacket,(LPARAM)port->m_nPortNr);
}
SetEvent(port->hSubsribe);
}
} // end forever loop
}
void CSerialPort::UnSubsribeData(void* pWho)
{
WaitForSingleObject(hSubsribe,INFINITE);
if ((DWORD)pWho == (DWORD)m_pOwner)
{
m_pOwner = NULL;
}
else if ((DWORD)pWho == m_idThread)
{
m_idThread = 0;
}
SetEvent(hSubsribe);
}
void CSerialPort::SubsribeData(void* pWho,BYTE bType)
{
WaitForSingleObject(hSubsribe,INFINITE);
if (bType == 0) //窗口
{
m_pOwner = (CWnd*)pWho;
m_idThread = 0;
}
else if (bType == 1) //线程
{
m_idThread = (DWORD)pWho;
m_pOwner = NULL;
}
SetEvent(hSubsribe);
}
void SerialInit(void* param)
{
BYTE byType;
DWORD Parm;
PRECCall pRecCall;
CWnd* pWnd;
DWORD dwThreadID;
BYTE szTestStr[] = "UART test string";
byType = (BYTE)*((DWORD*)param);
Parm = *((DWORD*)param+1);
pRecCall = (PRECCall)*((DWORD*)param+2);
if (byType == 0) //窗口
{
pWnd = (CWnd*)Parm;
dwThreadID = 0;
}
else if (byType == 1) //线程
{
pWnd = NULL;
dwThreadID = (DWORD)Parm;
}
else
{
pWnd = NULL;
dwThreadID = 0;
}
}
void SubscribeSeriData(void* pWho,BYTE pType)
{
SerialPort.SubsribeData(pWho,pType);
}
void UnSubscribeSeriData(void* pWho)
{
SerialPort.UnSubsribeData(pWho);
}