OpenEdv-开源电子网

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

串口发送数据是32位的,是得分成俩个16位的吗

[复制链接]

52

主题

160

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2019-6-27
在线时间
153 小时
发表于 2020-4-24 10:40:37 | 显示全部楼层 |阅读模式
1金钱
USARTx->DR寄存器是16位的,要是想发送一个32位的数据,是不是得把32位的换算成俩个16位的发送出去

最佳答案

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

DR寄存器只有低8位有效,
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2020-4-24 10:40:38 | 显示全部楼层
DR寄存器只有低8位有效,
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2020-4-24 10:54:42 | 显示全部楼层
没明白,串口协议一般是一个字节,都是8位的数组一个个的发的,何来16位发送?你是不是将寄存器配置,当成了寄存器发送
回复

使用道具 举报

4

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
491
金钱
491
注册时间
2018-7-25
在线时间
109 小时
发表于 2020-4-24 11:12:16 | 显示全部楼层
发送的是8位的吧
回复

使用道具 举报

8

主题

206

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-4-6
在线时间
234 小时
发表于 2020-4-24 11:26:42 | 显示全部楼层
USARTx->DR 是8位的,不是16位的。
回复

使用道具 举报

52

主题

160

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2019-6-27
在线时间
153 小时
 楼主| 发表于 2020-4-24 11:44:44 | 显示全部楼层
hgr211 发表于 2020-4-24 10:54
没明白,串口协议一般是一个字节,都是8位的数组一个个的发的,何来16位发送?你是不是将寄存器配置,当成 ...

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data));
   
  /* Transmit Data */
  USARTx->DR = (Data & (uint16_t)0x01FF);
}
这个不是一下发送俩个字节吗
回复

使用道具 举报

52

主题

160

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2019-6-27
在线时间
153 小时
 楼主| 发表于 2020-4-24 11:45:10 | 显示全部楼层
xiedonghui258 发表于 2020-4-24 11:26
USARTx->DR 是8位的,不是16位的。

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data));
   
  /* Transmit Data */
  USARTx->DR = (Data & (uint16_t)0x01FF);
}
这个不是一下发送俩个字节吗
回复

使用道具 举报

52

主题

160

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2019-6-27
在线时间
153 小时
 楼主| 发表于 2020-4-24 11:45:34 | 显示全部楼层

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data));
   
  /* Transmit Data */
  USARTx->DR = (Data & (uint16_t)0x01FF);
}
这个不是一下发送俩个字节么
回复

使用道具 举报

34

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
912
金钱
912
注册时间
2019-7-5
在线时间
189 小时
发表于 2020-4-24 12:14:34 | 显示全部楼层
如果是16位,就把32位数据分成两次发送,在接收端解码,发送和接收约定好就好了
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2020-4-27 08:43:25 | 显示全部楼层
冷风2699 发表于 2020-4-24 11:44
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */

你是来赞积分的吗?回复n个。这么多人多这么回复,你自己不能想想,自己有没有理解错了?人家这样子写是为了保证正确性知和将来的兼容性,其实只取了低8位
回复

使用道具 举报

0

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2020-4-21
在线时间
34 小时
发表于 2020-4-28 10:53:46 | 显示全部楼层
冷风2699 发表于 2020-4-24 11:45
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */

最后一句与上0x01FF不就是直接取了低9位吗,因为发送的数据可以配置为8位或者9位,哪里来16位
回复

使用道具 举报

52

主题

160

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2019-6-27
在线时间
153 小时
 楼主| 发表于 2020-4-28 13:08:30 | 显示全部楼层
hgr211 发表于 2020-4-27 08:43
你是来赞积分的吗?回复n个。这么多人多这么回复,你自己不能想想,自己有没有理解错了?人家这样子写是 ...

积分能换钱吗,想啥呢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-28 01:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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