//向串口写数据,内容在buf中,长度为bufLen
BOOL CSeries::WritePort(const char *buf, DWORD bufLen)
{
if(PostThreadMessage(m_dwWriteThreadID,CM_THREADCOMMWRITE,WPARAM(bufLen),LPARAM(psendmsgtrue)))
{
return TRUE;
}
return FALSE;
}
//消息处理
DWORD CSeries::WriteThreadFunc(LPVOID lparam)
{
CSeries *pSeries = (CSeries *)lparam;
MSG msg;
DWORD dwWritenLen=0;
char * buf=NULL;
while(TRUE)
{
//如果捕捉到线程消息
if(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
if(msg.hwnd!=0)
{
TranslateMessage(&msg);
DispatchMessage(&msg); continue;
}
if(msg.message==CM_THREADCOMMWRITE)
{
//向串口写
buf=(char *)msg.lParam;
dwWritenLen=msg.wParam;
WritePort(pSeries->m_hComm,buf,dwWritenLen);
//删除动态分配的内存
// delete[] buf;应该需要删除数据的吧?不知为何,程序里加上这句就出错
}
} if(WaitForSingleObject(pSeries->m_hWriteCloseEvent,500) == WAIT_OBJECT_0)
break;
pSeries->m_hWriteThread=NULL; }
return 0;
}现在的问题是:
1.delete[] buf,这里释放内存不对吗?为什么不能释放buf呢
2.PostThreadMessage时,buf内容为abcdefg,bufLen为7.可是从消息队列中取出消息后,buf中内容就不对了,而且 dwWritenLen长度只为1。
被这两个问题困扰很久了,望大家帮帮忙,非常感谢!
前面修改过一次,忘记改过来了,抱歉
char * buf=NULL;
buf=(char *)msg.lParam;
delete[] buf;我觉得buf应该new产生,所以使用char *buf=new char[128];可是不管什么情况下加上delete[] buf就会出错
至少你strcpy一下吧,不然你delete的内容就变成msg.lParam的了
通过这句话
你的buf就指向了lParam制定的地址
如果这个地址不是动态分配的
你这里就不用delete
否则一定会报错的
也就是说你这个函数里面不应该有delete buf这条语句
至于lParam指向的内存应该有调用函数的功能负责处理
否则这个逻辑就很乱
dwWritenLen=msg.wParam;buf内容为“烫AT+list”,而长度dwWritenLen为1。
数组中出现'烫',应该是内存的问题,到底怎么回事啊?