OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2677|回复: 9

串口接收数据的问题

[复制链接]

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
发表于 2017-10-12 10:07:02 | 显示全部楼层 |阅读模式
15金钱
请教各位大侠,小弟做串口接收程序的时候遇到了一个问题,上位机传过来的数组是先发高位后发低位,比如 原本应该发送这样的数组 :0x55 0x11 0xaa 0x10 上位机发送过来的是0x10 0xaa 0x11 0x55, 请问我应该怎么方便的处理这个数呢,因为上位机发过来的数有的是U16的  又有的是U32的,希望有个可以通用的办法。求各位大侠给点建议,谢谢了!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13118
金钱
13118
注册时间
2012-11-26
在线时间
3813 小时
发表于 2017-10-12 10:11:10 | 显示全部楼层
自己转换组合下不就好了    自己定好协议    搞不懂就去看C语言基础, <<  , >>
回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-10-12 10:40:03 | 显示全部楼层
jermy_z 发表于 2017-10-12 10:11
自己转换组合下不就好了    自己定好协议    搞不懂就去看C语言基础, >

可是他的数占的字节数是不一样的嘛,比如一个U32占4个字节0xaa 0x12 0x13 0x14 一个U16占2个字节 0x55 0x33,我这边应该收到是6个字节的数0xaa 0x12 0x13 0x14 0x55 0x33,可是实际上是0x14 0x13 0x12 0xaa 0x33 0x55,虽然顺序反了一下,可是U32的数还是在U16的前面,我再把每个可能性都定一个函数来转化我觉得特别的麻烦呀,感觉应该会有比这个有效的办法呢。
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-10-12 11:08:15 | 显示全部楼层
封装2个函数,一个发送,一个接收,大端模式发送就用大端模式接收,小端模式发送就用小端模式接收,接收完合并下交给应用;串口是字符型总线,所有数据转化为字节处理(发送/接收)。
[mw_shl_code=c,true]int usart_tx_data(unsigned char usart_num,char *tx_data,unsigned char data_length);
int usart_rx_data(unsigned char usart_num,char *rx_data,unsigned char data_length);[/mw_shl_code]
回复

使用道具 举报

8

主题

206

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-4-6
在线时间
234 小时
发表于 2017-10-12 11:17:07 | 显示全部楼层
楼主需要知道一点,单片机接受的buf都是一个8位的。所以,上位机发送过来的数据,下位机接受后在进行数据处理。处理的过程中,如果是u32类型,就强制转换为u32.
eg:((u32 )buf[0] << 24)|((u32 )buf[1]<<16)|((u32)buf[2]<<8) |((u32)buf[4]..
不知道这种方式行不行。个人想法而已
回复

使用道具 举报

4

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1194
金钱
1194
注册时间
2017-8-31
在线时间
295 小时
发表于 2017-10-12 11:35:22 | 显示全部楼层
上位机一次只发一个数据就按长度来判断是u8还是u32,多个还是自定通讯协议吧,让上位机在各个数据前加个标志位,下位机判断不同标志位处理不同长度的数据
回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-10-12 13:58:04 | 显示全部楼层
一起哈皮 发表于 2017-10-12 11:35
上位机一次只发一个数据就按长度来判断是u8还是u32,多个还是自定通讯协议吧,让上位机在各个数据前加个标 ...

通讯协议我是有的,我知道第几位是什么类型的,占多少个字节都是清楚的。所以您的意思就是针对每个类型都写一个函数来接收么?
回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-10-12 13:59:02 | 显示全部楼层
Acuity 发表于 2017-10-12 11:08
封装2个函数,一个发送,一个接收,大端模式发送就用大端模式接收,小端模式发送就用小端模式接收,接收完 ...

按照您这个样子那小端接收的函数里面又要去区分U8 U16 U32的不同的处理方法么?
回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-10-12 13:59:57 | 显示全部楼层
xiedonghui258 发表于 2017-10-12 11:17
楼主需要知道一点,单片机接受的buf都是一个8位的。所以,上位机发送过来的数据,下位机接受后在进行数据处 ...

我试试吧,谢谢!
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
发表于 2017-10-12 14:05:47 | 显示全部楼层
先缓存到一个大点 的数组,然后找包头,找到包头之后在返回去找数据
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 15:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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