USART————单字节串口的发送和发送接收

1、首先是串口发送的实验部分,先进行初始化

用到了USART和GPIO口的时钟并初始化,然后开启使能,其中GPIO口选择复用推挽模式,USART的参数分别为9600的波特率,选择为发送模式

然后是传输各类数据的函数

首先是发送一个字节的函数,这个属于最基础的函数,后续都会以这个为基础

之后是发送一个数组,通过for循环,逐次调用发送字节函数

之后是发送字符串的函数

之后是发送数字的函数,对于数字的发送,选用拆分数字的形式,即通过(数字/10^x次)%10分别得出数字的每一位,以下是10^x次函数

然后定义发送数字的函数,在显示部分加了一个偏移量,因为根据16进制的ASCLL码来说,数字是在ox30或者'0'之后才是数字,因此需要加一个偏移量。

主函数如下所示:分别发送一个16进制数字、数组、字符串、任意10进制数字(显示为10进制)

除了以上方式显示外,还有printf的移植函数;

一般采用第一种,第一种一次只能传输一个字节

定义一个函数在主程序中调用

第二种则是先定义一个字符串,然后打印,最后发送

第三种则是第二种的封装,其中用到了可变参数

以下为主程序中的函数,其中\r\n才表示换行

其中对于汉字的显示,如果Keil用UTF-8则需要在Misc Controls设置中增加一句,如下所示:

在串口助手中也需要配置为UTF-8的模式,如果用GB则两者都为GB,需要统一,这里使用UTF-8的模式

结果显示:

首先需要将串口号改为自己连接的模式在,此电脑-——设备管理器——端口有显示USB连接的串口号,之后打开串口,首先接收模式选择为HEX模式,这个是16进制的显示,因此不论传输什么都将显示为16进制的数字

之后改为文本模式,将以上程序正常显示,按复位键可以重新发送数据:

之后是串口的发送接收实验:

在以上代码的基础上增加了接收的部分程序:

首先是初始化部分:

增加GPIO口10的初始化

将USART的模式增加接收模式

接收主要分为两部分:查询和中断

首先是查询,去判断当RX的标志位置1,表明有数据需要接收,开始接收:

如果是中断,需要增加NVIC的配制以及中断函数:

主函数显示如下:

结果如下:

在发送区发送41,选择HEX模式,接收区有显示:

OLED屏也有显示:

以下是理论部分:

由于单片机的功能有限,因此需要外加别的东西实现功能,譬如蓝牙通信,出现通信协议

全双工:通信双方进行双向通信,双方可以同时发送和接收数据,打电话

半双工:只有一根线进行通信,双方可以交替发送和接收数据,对讲机

单工:只能规定方向的一根线传输,只有一方发送,一方接收不能互换,广播

异步通信没有单独的时钟线需要约定一个采样频率等,靠比特率;同步时钟线

单端信号的双方需要共地,差分信号不需要共地,USB有些模块也需要共地

点对点设备相当于老师叫你去办公室进行谈话

多设备相当于老师在教室和某个同学谈话(可挂载其他设备在总线),需要寻址的过程(找到对应学生)

串口通信可以实现芯片和电脑的通信

一般最简单的电路有以下4个即可

只有电平标准一致的电路才可实现通信

差分信号抗干扰性能强

串口参数:

波特率用于异步通信,如:1000bps,表示1秒发送1000个数据,一个数据是1ms

在空闲状态时,一直为高电平(上拉输入),当起始位来时,出现一个低电平,之后开始传输数据,停止位为高电平

数据位是低位先行,即传输16进制0F时转换为二进制为00001111,那么在发送时就为11110000,像入栈,低位先行之后接收方就能直接接收并显示数据。波形如下所示:

检验位分为:无校验、奇校验、偶校验

左边为无校验,右边为奇校验或者偶校验(只能在一定程度上检查数据是否出错)

对于右边来说:当传输数据为00001111,奇校验,则校验位需要置1,构成5个1,用于查询数据是否出错

CRC校验的性能更好。

接下来是一些串口波形:

发送OX55,波特率为9600,二进制为01010101,而数据为低位先行,就是10101010,起始位为0,停止位为1,无检验位,如下所示:

发送OX55,波特率为4800,波形周期为原来的两倍,偶检验,OX55二进制为01010101,发送时为10101010,偶检验位为0,波形如下:

停止位的长度也可配制:1位、1.5位、2位等

以下是连续发送两个OX55,一个是1位停止位,一个是2位停止位

总的来说是TX定时输出高低电平,RX定时读取高低电平。

USART的外设:

与UART相比多了一个同步通信,用于兼容其他协议,只接受时钟输出,并不能两个USART进行同步通信,它主要是异步通信

数据位长度包含校验位,有校验位数据位为9,没有就是8位

一般在配制时波特率为9600或者115200,无校验位,数据位为8,1位停止位

硬件流控制可以防止当A向B传输数据时因为B的处理速度过慢而导致新数据替代旧数据,有了一根线之后只有当B准备好时A才会传数据。

接下来是一个流程图

当数据传输到发送移位寄存器时,TXE就置1,不论寄存器里的数据是否被转移;当数据传输到RDR时,RXNE置1表示有数据进来需要接收。右移数字。

不同停止位:

之后是采样是当一直检测到高电平,突然出现一个0时,可能表示出现下降沿,将开始16次采样,防止是噪声导致的下降沿出现,前边不满足以下条件都视为噪声引起的错误下降沿,之后开始重新接收,如果在每3位中出现2个0可认为检测通过,但是噪声标志位NE置1,表明有数据接收,但是存在噪声。然后如果经过两次检测后发现接收的数据不是噪声造成,就将8、9、10位作为每一位的正中间进行采样,从而对其了接下来每一个数据位。

之后数据位进行接收,8、9、10次的采样数据为准(正中间,不存在数据正在翻转情况),如果全为1或0就为1或0,如果2个1,1个0,该数据位就为1,反之亦然,这种情况下噪声标志位依然是1。

之后是波特率发生器的定义(库函数可直接得,了解即可)

当输出波特率为9600时,时钟内部频率为72MHz,DIV就等于72MHz/9600/16=468.75转化为二进制就是111010100.11高位补零,剩余补零。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hssfscv

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值