野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21241|回复: 3

串口发送数组

[复制链接]
发表于 2020-9-2 16:05:25 | 显示全部楼层 |阅读模式
当发送8位数数组时,在for循环中,火哥用的是Usart_SendByte(),如图: 野火论坛202009021555064747..png ,电脑能正常接受数Usart_SendByte()据。但我想在for循环中能不能使用
USART_SendData(),如图: 野火论坛202009021602538433..png ,keil并没有报错,但电脑接受的数据却是错误的.这是为什么呢?求解答.
回复

使用道具 举报

发表于 2020-9-2 17:33:42 | 显示全部楼层
我就这么理解的:
注意TC与TXE这两个寄存器的不同,SendData是往DR寄存器写数据,每次你都写进去,在循环里,TXE被置1,并没有清零;然后被最后一个0A覆盖,然后你清零TC完成。  那得到的肯定只有最后一个字节了。
而第一个火哥的是没问题的,每次发送一个字节,你可以点开这个SendByte函数,你会发现每发一个字节都调用了SendData,然后每次都对TXE清零,等所有字节都发送完了,
再判断下TC发送完成状态,确保发送正确。   没啥毛病。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-6 16:13:39 | 显示全部楼层
鸿雁北归12138 发表于 2020-9-2 17:33
我就这么理解的:
注意TC与TXE这两个寄存器的不同,SendData是往DR寄存器写数据,每次你都写进去,在循环里 ...

野火论坛202009061613155655..png
回复 支持 反对

使用道具 举报

发表于 2020-9-12 13:41:23 | 显示全部楼层

你使用的USART_SendData()库函数,只是往寄存器DR里写数据,而Usart_SendByte()函数是往DR寄存器里写了数据后,再判断TXE是否置1.
USART_SendData()库函数,没有判断TXE是否置1,这样会不断地往DR寄存器里写数据,会把之前的数据给覆盖掉,所以会导致你只发送了最后一个数据0A。
可参考手册里的发送时序。还有注意的是cpu写数据和移位寄存器一位一位发数据的速度是相差很大的,这是USART外设时钟与波特率的快慢。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 10:14 , Processed in 0.035002 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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