两个串口通信助手之间通信_串口通信那点事?

本文介绍了单片机或嵌入式系统开发中常用的串口通信。阐述了其传输原理,包括一帧数据的构成;说明了波特率的重要性及产生方法;讲解了数据收发方式,还提及新唐003用一个引脚实现半双工通信的高级功能,最后吐槽了系统时钟下波特率误差问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

b631548406dd4a392f2fb7374b0b8630.png

串口通信,是通用异步收发传输(Universal Asynchronous Receiver/Transmitter)的简称,有时我们也称为UART

在单片机或嵌入式系统开发中,经常利用串口来辅助调试,打LOG。所以是一种非常基本但很重要的通信协议。

1 传输原理

将传输数据的每个字符以串行方式一位接一位传输。通常我们将一次传输称为一帧,那么这一帧中包括了起始位(1位,逻辑0)、数据位(5~8,可软件设置,一般使用8位)、校验位(奇、偶、无)、停止位(1位、1.5位、2位,通常用1位)

一般,单片机都支持8位的数据位和1位停止位。

以新唐003为例,串口有四种模式,其中模式1为异步全双工的工作方式,一帧包括10位数据(起始位,8位数据位和1位停止位),在传输时,8位数据位最低位先发送(LSB)。

7ed724a02bcb9179268fe6b096428304.png

2 波特率

异步串口通信有个重要的参数为波特率,传输的发送端有波特率,接收端也有波特率,有各自的时钟,这也就是异步的意思。如果两者的波特率有较大偏差,接收端将不能正确地识别数据(误码率高),很多低端单片机使用11.0592MHz的晶振,原因就在于该时钟产生的波特率非常准确。

那么我现在想要115200的波特率,该如何产生呢?像8051内核一般不会内置串口时钟模块,需要使用定时器来产生固定频率,新唐003可以选择定时器1或定时器3来产生串口波特率。在配置定时器时需要注意的是 让定时器工作在自动重装模式并且不要打开定时器中断,我们只需要定时器产生时钟就可以了。

27a2ce3127865a6225805bb25eb323d8.png

3 数据的收发

了解基本原理后,接下来就到了数据收发阶段,其实很简单,在串口配置正确后,想要发送数据,就将数据写到SBUF寄存器。接收建议使用中断,当一帧数据接收完毕,接收标志RI将置1,如果使能接收中断,就会进入中断中,我们在串口中断中读SBUF寄存器就得到接收的数据。

ef26d637403fcdea329bc623e1720736.png

4 高级功能 使用1个引脚实现半双工通信

新唐003串口引脚可由用户定义为发送或者接收,因此可以使用一个引脚实现半双工收发。这对于IO资源有限的单片机是很有用的。

a6217c8bdbeeecece2a51a67cad27d9c.png

如用P06实现收发,P06功能配置如下

cb279c6edd0ff6d01e99bf79e79949a2.png

当发送数据前,将P06功能设置为发送,发送完一字节数据后,将P06的功能切换接收模式并打开中断。

239100eee2fc64e5723158b11690bcca.png

这个功能在通过UART升级固件时特别好用。

5 吐槽环节

系统时钟默认为16MHz,这个频率下出来的波特率误差都不小

19c8819aee999be4fa95ddbfdf38696b.png
7ca5e87be90a5f02ade67118428d88ec.png

虽然可以通过微调时钟到16.6MHz来解决,但这一大段代码加上去 还是不漂亮。

723a375ea28c281921c759e5f4ceb404.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值