OpenEdv-开源电子网

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

HAL库串口发送函数的一个小问题

[复制链接]

2

主题

3

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-1-9
在线时间
10 小时
发表于 2021-10-12 13:58:48 | 显示全部楼层 |阅读模式
10金钱
写代码的时候突发奇想,把下面的两个操作对比了一下:

int a[2] = {0xAA,0xBB};
HAL_UART_Transmit(&huart1,(uint8_t*)a,2,0xFF);

uint8_t b[2] = {0xAA,0xBB};
HAL_UART_Transmit(&huart1,b,2,0xFF);

输出分别是:
0xAA 0x00
0xAA 0xBB

我是个只懂靠HAL库和CSDN写代码的Ctrl-C-V猴子,有没有懂原理的大佬教教我上面两个操作的区别在哪里?造成区别的原因是什么?
拜谢!

最佳答案

查看完整内容[请看2#楼]

第二种就不说了 就是普通的发送两个字节。 第一种是由于int是4个字节。a[2]就是8个字节。因为stm32默认是小端模式,所以把这个数组转换为uint8_t类型数组其实就是[0xAA,0x00,0x00,0x00,0xBB,0x00,0x00,0x00], 你只发送两个字节。那自然就是0xAA,0x00了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

117

帖子

0

精华

高级会员

Rank: 4

积分
559
金钱
559
注册时间
2018-10-3
在线时间
107 小时
发表于 2021-10-12 13:58:49 | 显示全部楼层
第二种就不说了 就是普通的发送两个字节。 第一种是由于int是4个字节。a[2]就是8个字节。因为stm32默认是小端模式,所以把这个数组转换为uint8_t类型数组其实就是[0xAA,0x00,0x00,0x00,0xBB,0x00,0x00,0x00], 你只发送两个字节。那自然就是0xAA,0x00了
回复

使用道具 举报

4

主题

912

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2019-9-4
在线时间
916 小时
发表于 2021-10-12 14:44:57 | 显示全部楼层
我想的也不够通透,int是16位的,串口发送函数发的是8位的,强转的时候不是把数组的值转成8位的,而是把数组的地址转成了8位的指针,应该是这里的问题。
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2021-10-12 14:53:31 | 显示全部楼层
int是32位,(uint8_t*)a只是给串口函数一个地址,让它按照8位数来发出去。内存里存的数据其实是0x000000AA和0x000000BB,所以发完AA后下一个8位数就是00,你可以让串口函数发出8个8bit数,也就是等于2个int型。改成HAL_UART_Transmit(&huart1,(uint8_t*)a,8,0xFF),你会看到串口数据是AA 00 00 00 BB 00 00 00。
说白了就是数据类型的强制转换问题。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 18:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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