我在寫一個C++應用程序,用於半雙工通信從設備下載數據。以下是我用於串行通信的課程。串行通信讀取不能正常工作
class CSerialCommHelper
{
HANDLE m_pPortHandle; //Handle to the COM port
HANDLE m_hReadThread; //Handle to the Read thread
HANDLE m_hPortMutex; //Handle to Port Mutex
std::wstring m_strPortName; //Portname
COMMTIMEOUTS m_CommTimeouts; //Communication Timeout Structure
_DCB dcb; //Device Control Block
DWORD m_dwThreadID; //Thread ID
string m_strBuffer;
public:
CSerialCommHelper();
HRESULT Open();
HRESULT ConfigPort();
static void * ReadThread(void *);
HRESULT Write(const unsigned char *,DWORD);
string GetFrameFromBuffer();
HRESULT Close();
~CSerialCommHelper(void);
};
ReadThread和寫入功能如下:對於readthread釋放互斥
void * CSerialCommHelper::ReadThread(void * pObj)
{
CSerialCommHelper *pCSerialCommHelper =(CSerialCommHelper *)pObj;
DWORD dwBytesTransferred =0;
DWORD byte=0;;
while (pCSerialCommHelper->m_pPortHandle != INVALID_HANDLE_VALUE)
{
pCSerialCommHelper->m_strBuffer.clear();
pCSerialCommHelper->m_usBufSize=0;
WaitForSingleObject(pCSerialCommHelper->m_hPortMutex,INFINITE);
do
{
dwBytesTransferred = 0;
ReadFile (pCSerialCommHelper->m_pPortHandle,&byte,1,&dwBytesTransferred,NULL);
if (dwBytesTransferred == 1)
{
pCSerialCommHelper->m_strBuffer.push_back((char)byte);
pCSerialCommHelper->m_usBufSize++;
continue;
}
}
while ((dwBytesTransferred == 1) && (pCSerialCommHelper->m_pPortHandle != INVALID_HANDLE_VALUE));
ReleaseMutex(pCSerialCommHelper->m_hPortMutex);
Sleep(2);
}
ExitThread(0);
return 0;
}
寫入功能等待和寫入數據到端口。 GetFrameFromBuffer將從使用SerialCommhelper 的應用程序中調用,並返回m_strBuffer字符串。
我的問題是每當我試圖下載大量的數據。 我正在丟失一些數據幀。 我得到的設備響應時間在.0468到.1716秒之間。
經過分析不同的錯誤情況後,我才知道,隨着其他幀以相同的時間間隔下載,它不會出現問題。
調用getframebuffer的函數不斷調用它,直到得到填充的字符串。
一個傳球筆記,也許無關。當你像這樣拋出這個參數時,你認爲無論函數是否開始,線程(及其數據)的壽命都會比線程長。不要假定這樣的事情是安全的,而應保留一個本地副本。但是,也許你已經想過了,並且有一些你正在傳遞的全局實例 –
我曾經在一個項目上工作過,一旦使用了非常相似的方法從投影儀讀取串行數據,這些數據也會間歇性地失敗。不幸的是,我們從來不知道爲什麼,但改變閱讀方法來使用[Completion Routines](http://msdn.microsoft.com/en-us/library/windows/desktop/aa365601%28v=vs.85%29。 aspx)解決了這個問題。 – parrowdice
Sleep()調用非常可疑,將其刪除並解決實際問題。 m_hPortMutex也非常令人毛骨悚然,當多線程調用ReadFile並且每個線程都獲得一條數據時,沒有什麼好事發生。你沒有希望再次精確地將它們粘在一起。 –