• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

串口通信数据保存的问题

xinxzhao 2008-04-12 09:15:52
各位好,还是老问题,请问有过做串口通信接收单片机大批量数据在朋友:
单片机的AD是24位的.我用VC串口接收,把数据以字节形式保存.但现在是我要用这些数据进行算,我必须要把三个字节的数合成一个数来运算.关于这个问题,一般都是怎么解决的?整型数据是32位,我的想法是对字节进行移位再相或,就是三个字节,第一个字节向左移24位,第二个字节向左移16位,第三个字节向左移8位,再进行或运算.用带符号整型保存.这样就把三字节凑成一个整型保存.但是我这样做觉得很麻烦,会不会有更简单的方法,比如读缓冲区的时候就可以一定方式读啊什么的.
希望有经验的朋友指点一二.一般从单片机接收到数据后,还要经过怎样的操作,才能够参与运算啊.
急啊,分虽微薄,希望多多指教,谢!!!!!!!!!!!!!!!!!!!!!
...全文
88 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
首先你要考虑你的字节序,如果按intel的 高字节在高地址,你就省事了,弄一个变量

unsigned long l;

*p是3个字节的数据

l = 0;
memcpy( ( unsigned char * )&l, p, 3 );
这时可以使用l

如果是和intel格式相反的。

l = 0;
unsigned char *q = ( unsigned char * )&l

memcpy( q + 1, p, 3 );
l = htonl( l );

这时可以使用l

通讯中也有对齐的用法,通讯单元一般对齐成1,2,4字节,目的就是为了使用方便。
回复
cnzdgs 2008-04-13
如果考虑符号位,可以这样:
BYTE Data[4]; // Data[0]空着不用,把接收的数据依次放在后3个字节里面
long i = *(long*)Data;
i >>= 8;
回复
xinxzhao 2008-04-13
谢谢各位了,但是否还得考虑符号位?因为下位机上来的是带符号的数.
回复
alan001 2008-04-13
char *p;
long *pp;

pp=*((long *)(p+=3));
回复
mr.zhoux 2008-04-13
上面错了 应该是
dw += *pFirst;
dw < < 8;
dw += *pSecond;
dw < < 8;
dw += *pThread;
回复
mr.zhoux 2008-04-13
上面错了 应该是
dw += *pFirst;
dw < < 8;
dw += *pSecond;
dw < < 8;
dw += *pThread;
回复
mr.zhoux 2008-04-13
真要按你那样转换其实不用什么位,高第4位始终为0,

DWORD dw;
BYTE *p = (BYTE *)&dw;
*(p) = *pFirst;
*(p+1) = *pSecond;
*(p+2) = *pThird;

你喜欢移位也可以
DWORD dw;

dw += *pFirst;
dw << 8;
dw += *pSecond;
dw << 8;
dw += *pThread;
dw << 8;
回复
cnzdgs 2008-04-12
你保存的时候处理一下,把这3个字节数据用4个字节来存,最后一个字节赋值为0,用的时候直接按DWORD来取就可以了。或者你不做这个处理,直接取DWORD,然后&=0xffffff也可以。
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-04-12 09:15
社区公告

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