串口程序如下,WritePort函数通过PostThreadMessage投递消息到写线程WriteThreadFunc,这两个函数如下所示:
BOOL CSeries::WritePort(const char *buf, DWORD bufLen)
{
CopyMemory(psendmsgtrue,buf,1024); if(PostThreadMessage(m_dwWriteThreadID,CM_THREADCOMMWRITE,WPARAM(bufLen),LPARAM(psendmsgtrue)))
{
TRACE(L"发送写消息成功"); return TRUE;
}
TRACE(L"发送写消息失败");
return FALSE;
}
DWORD CSeries::WriteThreadFunc(LPVOID lparam)
{
CSeries *pSeries = (CSeries *)lparam;
MSG msg;
DWORD dwWritenLen=0; while(TRUE)
{
//如果捕捉到线程消息
if(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
if(msg.hwnd!=0)
{
TranslateMessage(&msg);
DispatchMessage(&msg); continue;
}
if(msg.message==CM_THREADCOMMWRITE)
{
//向串口写
char *pbuf = (char *)msg.lParam;
dwWritenLen=msg.wParam;
WritePort(pSeries->m_hComm,pbuf,dwWritenLen);//这个重载的WritePort函数
调用WriteFile函数写串口 //删除动态分配的内存
delete []pbuf;
}
} if(WaitForSingleObject(pSeries->m_hWriteCloseEvent,500) == WAIT_OBJECT_0)
{
break;
} pSeries->m_hWriteThread=NULL;
}
return 0;
}在向串口循环写数据时,在一个单独开辟的线程中:
char Data[512]={0x24,0x24,0x24,0x24};
char Data1[512]={0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44};
while(1)
{
Sleep(500);
m_series.WritePort(otherData,4);//调用上面的WritePort函数写串口 Sleep(500);
m_series.WritePort(otherData1,8);
}
问题是,如果没有上面的两个 Sleep(500);程序就会出错,串口发出的数据就会乱码,通过调试发现,如果没有 Sleep ,连续调用WritePort函数,在WritePort函数中投递消息前数据还是正确的,而在那个写线程收到消息后,lpraram里的数据就会出错;如果有Sleep之后,数据就正确了,而且Sleep的时间还要大于500ms;
我认为应该是消息处理可能需要花费比较多的时间,是不是这样呢?
但是能否有其他办法,这样连续向串口写不同数据,还要确保数据正确呢?
请大家指教了
BOOL CSeries::WritePort(const char *buf, DWORD bufLen)
{
CopyMemory(psendmsgtrue,buf,1024); if(PostThreadMessage(m_dwWriteThreadID,CM_THREADCOMMWRITE,WPARAM(bufLen),LPARAM(psendmsgtrue)))
{
TRACE(L"发送写消息成功"); return TRUE;
}
TRACE(L"发送写消息失败");
return FALSE;
}
DWORD CSeries::WriteThreadFunc(LPVOID lparam)
{
CSeries *pSeries = (CSeries *)lparam;
MSG msg;
DWORD dwWritenLen=0; while(TRUE)
{
//如果捕捉到线程消息
if(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
if(msg.hwnd!=0)
{
TranslateMessage(&msg);
DispatchMessage(&msg); continue;
}
if(msg.message==CM_THREADCOMMWRITE)
{
//向串口写
char *pbuf = (char *)msg.lParam;
dwWritenLen=msg.wParam;
WritePort(pSeries->m_hComm,pbuf,dwWritenLen);//这个重载的WritePort函数
调用WriteFile函数写串口 //删除动态分配的内存
delete []pbuf;
}
} if(WaitForSingleObject(pSeries->m_hWriteCloseEvent,500) == WAIT_OBJECT_0)
{
break;
} pSeries->m_hWriteThread=NULL;
}
return 0;
}在向串口循环写数据时,在一个单独开辟的线程中:
char Data[512]={0x24,0x24,0x24,0x24};
char Data1[512]={0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44};
while(1)
{
Sleep(500);
m_series.WritePort(otherData,4);//调用上面的WritePort函数写串口 Sleep(500);
m_series.WritePort(otherData1,8);
}
问题是,如果没有上面的两个 Sleep(500);程序就会出错,串口发出的数据就会乱码,通过调试发现,如果没有 Sleep ,连续调用WritePort函数,在WritePort函数中投递消息前数据还是正确的,而在那个写线程收到消息后,lpraram里的数据就会出错;如果有Sleep之后,数据就正确了,而且Sleep的时间还要大于500ms;
我认为应该是消息处理可能需要花费比较多的时间,是不是这样呢?
但是能否有其他办法,这样连续向串口写不同数据,还要确保数据正确呢?
请大家指教了
在发送后会被删除..............小心指针
是这样定义的:char psendmsgtrue[512];
psendmsgtrue是类的数据成员。
dwWritenLen=msg.wParam;
//在这加::Sleep(500); 效果是一样的
WritePort(pSeries->m_hComm,pbuf,dwWritenLen);//这个重载的WritePort函数调用WriteFile是这的问题第一次的数据还没发完第二次的数据就到了 pbuf 里的数据就变了所以数据就乱了
在你这里加了Sleep(500),是不行的。现在确实是连续收到两次消息使pbuf的数据乱了。但是这里加Sleep解决不了问题,因为那边投递了消息,消息处理这边本来就处理的慢,就来不急,若再Sleep,串口发出来的数据跟WritePort时的数据还是不对的。