串口的基本概念

串口(Serial Port)是一种用于串行通信的物理接口,通过单条数据线逐位传输数据。常见的串口标准包括RS-232、RS-422和RS-485,其中RS-232最为广泛使用。串口通信通常用于设备间的低速数据传输,如工业控制、嵌入式系统调试等。所以,学习和熟练掌握串口是非常重要的。

串口的工作原理

串口通信通过发送端和接收端的协议实现数据同步。数据以二进制形式逐位传输,起始位和停止位标记数据包的开始和结束。波特率(Baud Rate)决定数据传输速度,常见值有9600、115200等。校验位(Parity Bit)用于简单的错误检测。(串口一般属于异步通信,特殊的串口也可以作为同步通信也是ok的

接线

首先是接线,我们使用的硬件设备是STM32F103C8T6这款单片机,还有CH340的TTL转串口模块。

单片机----------------------------TLL转串口模块

TX------------------------------------>RX

RX------------------------------------>TX

GND---------------------------------->GND

注意接线是单片机的TX(发送端口)接TTL模块的RX(接收端口),接地端接到单片机的GND端口,其余的TTL转串口模块的端口可以不接。

配置CubeMX

第一步:首先配置下载端口(我们这里使用的下载器端口为ST-Link)。

第二步:配置外部高速时钟。

第三步:配置时钟频率为72MHZ。

第四步:配置USART1,串口1,设置波特率为(Baund Rate)115200bit/s,接收字节的长度设置为8(Word Length)8bit,Parity(校验位)这里我们设置None(无),Stop Bits(停止位)设置为1位(1位相当于是1bit)(注意波特率不要搞错了!!!!!

然后我们的CubeMX就已经配置完成了,开始写代码!!!!

发送一个数据

这里我们介绍串口的一个发送的一个接口函数

HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)

我们详细介绍一下这个发送函数,首先我们看第一个参数UART_HandleTypeDef *huart这个参数是串口的句柄,我们开启了串口1,那我们的串口1对应的句柄则是huart1,计算机就是通过这个句柄来进行确定使用串口1来发送的,第二个参数为*pData,这个参数pData的指针变量,也可以理解为是一个数组,这里的参数其实填入的不是数值,而是数值对应所在的地址,我们需要用&(取地址符号来进行取地址),第三个参数Size,这个参数是每次使用此函数一次所能传输的字节大小(比如我填1,则一次传输1字节大小的数据),Timeout,这个参数为超时时间(意思是超过TimeOut时间后,则会跳出此函数,保护程序不因为串口收发故障而导致程序卡死)。

发送字符串

这样我们就能进行字符串的发送了,sizeof(这个函数为计算字符串的总长度),为什么要减1呢?小伙伴们你们可以试试不减1的情况就知道了,因为字符串的结束有\0这个结束的标志,所以我们减一就是为了去掉字符串特定的结束标志。

printf重定向进行串口数据发送

这个函数就是重定向函数,执行printf的时候,printf就会进入fputc执行fputc函数内部逻辑。简单的讲就是fputc是printf的内函数。(补充(uint8_t *)这个意思为对ch进行强制类型转化为指针类型的数据也就是相当于文中int类型变为了(uint8_t *)类型)

需要加入c语言的库函数!!!!!

并且点开魔术棒找到Target选项勾选Use MicroLIB(使用微库),如果不勾选则无法使用printf()!!!!!!!!!!!!

printf的使用和c语言一样,可输出变量,也可以直接输出字符串!!!

数据的接收

HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

接收也有一个接口函数,我们来详细介绍其各个参数,第一个参数,前文已经提到过了是串口的句柄,这个到底在哪里看呢

我们可以点usart.c的我们就能看到句柄了,接着我们介绍第二个参数,pData,这个参数是用来存储接收到的数据的,第三个参数则为一次接收多长的数据(如果填写1,则意思为接收1byte的数据),Timeout参数前文提过了,就是超时时间,主要目的是用来保证系统不会因为串口收发而卡死。

这里我再对HAL_MAX_DELAY这个参数进行解释(这个参数的意思是最大延时,直到接收完为止才跳出函数,不然一直卡在接收环节),如果做项目的小伙伴不建议这样使用!!!!!

到此我们已经介绍了关于串口最基本的串口发送和接收,后续我还会推出中断接收,不定长的数据收发,以及DMA收发等!!!!!

喜欢博主的点点小小的赞,并且持续关注博主哦~~~~~~

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐