我在写一个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并且每个线程都获得一条数据时,没有什么好事发生。你没有希望再次精确地将它们粘在一起。 –