VC 串口 PostThreadMessage投递消息时参数错误

xianzi123 2010-04-21 03:53:08

//向串口写数据,内容在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。
被这两个问题困扰很久了,望大家帮帮忙,非常感谢!
...全文
207 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 xianzi123 的回复:]
恩,谢谢大家了!
[/Quote]

问题解决了?
xianzi123 2010-04-22
  • 打赏
  • 举报
回复
恩,谢谢大家了!
wangli820 2010-04-22
  • 打赏
  • 举报
回复
你的串口操作是异步的吧,你在没有等串口操作完成之前,就释放了缓冲区内存,串口操作肯定要出错。把释放内存放到串口操作完成之后。
chenyehao 2010-04-21
  • 打赏
  • 举报
回复
界分。。。顶
wjz748305545 2010-04-21
  • 打赏
  • 举报
回复
接分,顶
etz2008 2010-04-21
  • 打赏
  • 举报
回复
顶一下
学到过函数
liuharris 2010-04-21
  • 打赏
  • 举报
回复
还是把代码贴出来吧
xianzi123 2010-04-21
  • 打赏
  • 举报
回复
起初向串口循环发送字符s,当串口接收到数据后,停止发送s,改发字符串,比如字符串“at+list”.

发送s时是正常的,在串口收到数据后,发送at+list时,PostThreadMessage时的buf为

“at+list”,bulLen为8.而在 消息处理时,这两句中buf=(char *)msg.lParam;
dwWritenLen=msg.wParam;

buf内容为“烫AT+list”,而长度dwWritenLen为1。
数组中出现'烫',应该是内存的问题,到底怎么回事啊?

xianzi123 2010-04-21
  • 打赏
  • 举报
回复
那关于 第二个问题呢?为什么向线程投递消息后,消息中参数wparam和lparam的内容都跟投递前不一样了呢
xianzi123 2010-04-21
  • 打赏
  • 举报
回复
哦,这样啊,我试试...
vivvan 2010-04-21
  • 打赏
  • 举报
回复
把msg.lParam的字符拷进buf里面,你所说的问题就都解决了

楼主还是乱用指针造成的啊
向立天 2010-04-21
  • 打赏
  • 举报
回复
buf=(char *)msg.lParam;
通过这句话
你的buf就指向了lParam制定的地址
如果这个地址不是动态分配的
你这里就不用delete
否则一定会报错的
也就是说你这个函数里面不应该有delete buf这条语句
至于lParam指向的内存应该有调用函数的功能负责处理
否则这个逻辑就很乱
vivvan 2010-04-21
  • 打赏
  • 举报
回复
这里应该不可以直接buf=(char *)msg.lParam;
至少你strcpy一下吧,不然你delete的内容就变成msg.lParam的了
xianzi123 2010-04-21
  • 打赏
  • 举报
回复
另外,在debug版本下,delete[] buf会出错,而Release版本下不会报错
xianzi123 2010-04-21
  • 打赏
  • 举报
回复
buf是这样使用的:
char * buf=NULL;
buf=(char *)msg.lParam;
delete[] buf;

我觉得buf应该new产生,所以使用char *buf=new char[128];

可是不管什么情况下加上delete[] buf就会出错
aa3000 2010-04-21
  • 打赏
  • 举报
回复
buf 是 new 出来的吗?

WritePort 后有 delete buf 吗?
xianzi123 2010-04-21
  • 打赏
  • 举报
回复
不好意思,写错了,PostThreadMessage 的最后一个参数是buf,
前面修改过一次,忘记改过来了,抱歉
aa3000 2010-04-21
  • 打赏
  • 举报
回复
PostThreadMessage 的最后一个参数是 psendmsgtrue ?

可以强制转换成 buf=(char *)msg.lParam ?

不出错就怪了
xianzi123 2010-04-21
  • 打赏
  • 举报
回复
谢谢帮顶,如果有明白的,请多多指点...

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧