您的位置:首页 > 其它

多界面程序中,通信数据直达各个界面的方法

2015-03-31 16:37 176 查看
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: