电建论坛

 找回密码
 注册
查看: 3027|回复: 12

是memcpy的错还是volatile的错???

[复制链接]
发表于 2012-8-8 11:28:41 | 显示全部楼层 |阅读模式
本帖最后由 lvpengandy 于 2012-8-8 11:34 编辑

最近在做电表645规约,
在编程时经常用到memcpy函数,
当然也必须使用volatile来修饰通信接收到的数据缓冲数组,
即是volatile unsigned char Rx_Buf[ 200];//接收缓冲
而发送缓冲一般不用volatile修饰,
即是unsigned char Tx_Buf[ 200];//发送缓冲
我为了验证通讯的正常与否,
就在接收数据完毕之后立即把接收缓冲数组的数据copy到发送缓冲数组中,
因此就用到了memcpy函数,
即memcpy(  &Tx_Buf[0],  (unsigned char *)Rx_Buf [0], 200 );
这里,因为Rx_Buf 是volatile修饰的,所以必须进行强制转换,否则会因为不符合memcpy参数的类型要求而导致编译不通过
最后竟然发现copy的数据不是接收缓冲中的数据,而是一些固定的值,是“0x18,0xf0,0x9f,0xe5”等等数据,
奇怪的是每次的数据都是这几个。
发现原因了,就只能修改这个copy过程了,
换成for循环肯定没问题的。
后来我在发帖时,突然想试试另一种写法,
即memcpy(  Tx_Buf,  (unsigned char *)Rx_Buf , 200 );
结果竟然编译通过,结果也是正确的了!OMG,这到底怎么回事啊 ???

----------------------------------------------------------------------
文笔不太好,所以写的可能不是很通顺,以后我会努力做到最好的!谢谢
 楼主| 发表于 2012-8-8 11:29:37 | 显示全部楼层
本帖最后由 lvpengandy 于 2012-8-8 11:35 编辑

猜测应该是指针应用的问题,看来我的C的指针方面还是有待提高啊!!!
 楼主| 发表于 2012-8-8 11:39:56 | 显示全部楼层
追加个问题啊:
定义是:volatile unsigned char Rx_Buf[ 200];//接收缓冲
因此 Rx_Buf = &Rx_Buf [0];是整个数组的指针,也是Rx_Buf [0]的指针,即地址
Rx_Buf是指针,类型是volatile unsigned char 还是volatile unsigned char * ?
而(unsigned char *)Rx_Buf 就是把Rx_Buf的指针类型强制转换为unsigned char还是unsigned char* ?
而(unsigned char *)Rx_Buf[0]就是把Rx_Buf[0]这个1字节数当做地址,然后强制转换为一个指针了,
是这个意思吗?
 楼主| 发表于 2012-8-9 09:54:56 | 显示全部楼层
好冷清的论坛啊!
 楼主| 发表于 2012-8-10 09:39:33 | 显示全部楼层
刚刚百度了下“指针”,百度百科讲的太没有层次了,受不了。
 楼主| 发表于 2012-8-10 09:40:58 | 显示全部楼层
怪不得说高手都在民间呢。搜了好久终于搜到一篇好文章,讲解“指针”的详细的博文,篇幅太长,就不在此处转载了,只给下链接吧:
http://topic.csdn.net/u/20080504 ... 8-233bdb975ca1.html
发表于 2012-8-10 09:52:22 | 显示全部楼层
我只知道 中国有你更精彩。
 楼主| 发表于 2012-8-10 09:53:05 | 显示全部楼层
顶自己的帖子
 楼主| 发表于 2012-8-10 09:53:42 | 显示全部楼层
回复 7# 蒸汽锅炉


    谢谢了,嘿嘿
 楼主| 发表于 2012-8-15 10:17:09 | 显示全部楼层
暂且先这么认为吧!高手都潜水去了吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|电力建设网站 ( 苏ICP备16030970号-1 )|网站地图

GMT+8, 2024-5-21 07:49 , Processed in 0.215402 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表