[求助] 串口API读取出数据,但memcpy后就不对了

chenjelly 2011-01-14 03:46:27
在程序中,用串口API接收数据,能正确读取出数据,但用memcpy把接收到的BYTE类型的数据recvbuff拷贝到另一个BYTE变量pBuff中后,pBuff中的数据不对了

查了一天多,目前仍未找出问题所在,求高手帮忙


拷贝部分的代码如下:

BYTE *pBuff = new BYTE[wCount+1];
memset(pBuff,'\0',wCount+1);
memcpy(pBuff,recvbuff,wCount+1);
...全文
213 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
huang_gen 2011-01-16
  • 打赏
  • 举报
回复
memcpy(pBuff,recvbuff,wCount+1);改为
memcpy(pBuff,recvbuff,wCount);试试,可能是recvbuff中的内容太多,导致pBuff没有结束字符,也有可能是你的recvbuff没有结束字符
野男孩 2011-01-14
  • 打赏
  • 举报
回复
嗯,知道问题了就好。二进制数据不要动不动就转换成字符串
zhourenyun 2011-01-14
  • 打赏
  • 举报
回复
由于 陈庆 的隐私设置,你不能访问当前内容
=======
!!
covsno 2011-01-14
  • 打赏
  • 举报
回复
BYTE *pBuff = new BYTE[wCount+1];
memset(pBuff,'\0',wCount+1);
memcpy(pBuff,recvbuff,wCount+1);///字符串结束符也要占位置的
chenjelly 2011-01-14
  • 打赏
  • 举报
回复
用str.Format("%02X ",recvbuff[i]);//(我要实现的是16进制显示)BYTE 转换成CString,这种方式对不
手机写程序 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 chenjelly 的回复:]
引用 9 楼 tttk 的回复:
地址不能访问。

由于 陈庆 的隐私设置,你不能访问当前内容



好幽默的人哦


呵呵……谢谢
[/Quote]
一点都不幽默,是真不能访问.
zhou1xp 2011-01-14
  • 打赏
  • 举报
回复
你是用的UNICODE字符么,你转CString的时候变成UNICODE了
验证码识别 2011-01-14
  • 打赏
  • 举报
回复
没发现代码有什么问题
chenjelly 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 happyparrot 的回复:]
应该是BYTE数组中包含有0x00字符,转换成CString是不行的,0x00后的会自动被截掉。
[/Quote]

我不知道原因是什么?因为在接收的线程中,将recvbuff(一个BYTE数组)转换成CString后,显示的内容是对的,但在主线程中,对于传递回的BYTE指针,用相同的方法时,不仅遇到0x00不会显示,而且能显示的个数很少……
快乐鹦鹉 2011-01-14
  • 打赏
  • 举报
回复
应该是BYTE数组中包含有0x00字符,转换成CString是不行的,0x00后的会自动被截掉。
chenjelly 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 covsno 的回复:]
我估计楼主最后把它转成字符串了
[/Quote]


被您说中了……就是在转换过程中,显示得不对,但是内存中的数据是对的

以前也是这种方法读取API,能够接收成功,并能解析处理再入库


可能出现的问题的是地方是:BYTE转换成CString的问题,目前没有明白道理





呵呵……谢谢大家的帮助……

chenjelly 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 tttk 的回复:]
地址不能访问。

由于 陈庆 的隐私设置,你不能访问当前内容
[/Quote]


好幽默的人哦


呵呵……谢谢
tttk 2011-01-14
  • 打赏
  • 举报
回复
内存拷贝后,如果调试显示结果一致,问题可能出在多线程上,memcpy这种非常底层的函数,一般不会出错。
tttk 2011-01-14
  • 打赏
  • 举报
回复
地址不能访问。

由于 陈庆 的隐私设置,你不能访问当前内容
chenjelly 2011-01-14
  • 打赏
  • 举报
回复
chenjelly 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 happyparrot 的回复:]
memcpy(pBuff,recvbuff,wCount+1);
应该是memcpy(pBuff,recvbuff,wCount);吧,你是直接看pBuff的值不对吗?那么memcpy时,recvbuff的值正确吗?代码能再全一点吗
[/Quote]

recvbuff接收的数据是正确的,(在一个UI线程中实现串口API接收和发送数据的)

调试的时候,发现pBuff的内存数据也是改变了的,
但是我把通过消息数据传回主线程的时候,得到的数据,查看内存是对了,但显示,解析就与UI线程中的显示不一样,主线程中只能 显示一部分
covsno 2011-01-14
  • 打赏
  • 举报
回复
我估计楼主最后把它转成字符串了
frankyhit 2011-01-14
  • 打赏
  • 举报
回复
估计你是哪个地方越界了。
varding 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 chenjelly 的回复:]
在程序中,用串口API接收数据,能正确读取出数据,但用memcpy把接收到的BYTE类型的数据recvbuff拷贝到另一个BYTE变量pBuff中后,pBuff中的数据不对了

查了一天多,目前仍未找出问题所在,求高手帮忙


拷贝部分的代码如下:

BYTE *pBuff = new BYTE[wCount+1];
memset(pBuff,'\0',wCount+1……
[/Quote]

没看出啥问题

代码多贴点
加载更多回复(2)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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