野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15200|回复: 8

关于串口发送字节的函数的一个问题

[复制链接]
发表于 2021-10-3 16:27:08 | 显示全部楼层 |阅读模式
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)这个函数,视频里第二个参数用的8位的,为什么不会报错或者警告啥的,也没有强制类型转换。0x64 立即数难道可以默认成形参的类型?


回复

使用道具 举报

发表于 2021-10-6 11:06:50 | 显示全部楼层
串行通信的原则就是把数据转化成按位发送,不论几位的数据都是一位一位的传输。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-7 22:26:41 | 显示全部楼层
一级菜鸟 发表于 2021-10-6 11:06
串行通信的原则就是把数据转化成按位发送,不论几位的数据都是一位一位的传输。 ...

但是从C语言的语法规则看,不是有问题吗?
回复 支持 反对

使用道具 举报

发表于 2021-10-9 12:44:50 | 显示全部楼层
WaterCurtain 发表于 2021-10-7 22:26
但是从C语言的语法规则看,不是有问题吗?

如果我没记错的话,这个函数的作用是往DR寄存器里写值
在函数里有一个USARTx->DR = (Data & (uint16_t)0x01FF);这个操作就是把区这个16位的数的9位,写入DR寄存器(这个寄存器9位有效)

无论形参是8位,16位的数据,调用这个函数都会是以8位或9位的数据写入
他这是使用形参16位是为了兼容9位数据格式的写入
视频中8位的形参是因为串口初始化时数据宽度设置了8位,所以他不考虑9位的数据格式而直接使用8位的形参
仔细对照STM参考手册,并查看源码就会明白其中原理。无论是否使用固件库编程本质上都是对寄存器操作。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-15 21:23:02 | 显示全部楼层
一级菜鸟 发表于 2021-10-9 12:44
如果我没记错的话,这个函数的作用是往DR寄存器里写值
在函数里有一个USARTx->DR = (Data & (uint16_t)0x ...

嗯,你说的这个我知道,不过还是谢了,我主要是对那个实参和形参数据类型不同有点疑惑,有的编译器貌似不会对这个问题报错。。
回复 支持 反对

使用道具 举报

发表于 2021-10-16 16:16:12 | 显示全部楼层
WaterCurtain 发表于 2021-10-15 21:23
嗯,你说的这个我知道,不过还是谢了,我主要是对那个实参和形参数据类型不同有点疑惑,有的编译器貌似不 ...


你是不是疑惑16位的形参可不可以传入8位的数据?
这个在C的语法里是可以的
屏幕截图 2021-10-16 161315.png
回复 支持 反对

使用道具 举报

发表于 2021-10-16 16:34:50 | 显示全部楼层

甚至这样都是可以的实参和形参类型不同都能传入

屏幕截图 2021-10-16 163141.png
回复 支持 反对

使用道具 举报

发表于 2021-10-16 16:41:50 | 显示全部楼层
传入以后相当于强制类型转换了这样你应该就能看懂了

屏幕截图 2021-10-16 164102.png
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-17 16:35:44 | 显示全部楼层
一级菜鸟 发表于 2021-10-16 16:41
传入以后相当于强制类型转换了这样你应该就能看懂了

感谢感谢。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-12-5 20:45 , Processed in 0.044115 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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