设备与驱动:UART设备

发布于:2025-05-08 ⋅ 阅读:(18) ⋅ 点赞:(0)

        大部分的嵌入式系统都包括一些I/O设备,例如仪器上的数据显示屏、工业设备上的串口通信、数据采集设备上模拟数据采样、用于保存数据的Flash/SD卡以及网络设备上的以太网接口等,都是嵌入式系统中容易找到的I/O设备例子。

        本专栏主要是分享RT-Thread是如何对不同的I/O设备进行管理的。读完本专栏,我们会了解到如何从宏观角度去管理I/O设备,为我们在编写代码时有一个参考的管理模型,从而提高我们代码的复用性、降低耦合性,从而实现换硬件不动软件的目标。.

1、《设备与驱动:I/O设备模型

2、《设备与驱动:UART设备

3、《设备与驱动:PIN设备

4、《设备与驱动:ADC设备

5、《设备与驱动:DAC设备

6、《设备与驱动:CAN设备

目录

一、UART简介

1)起始位

2)数据位

3)奇偶校验位

4)停止位

5)波特率        

二、奇偶校验位的工作原理

1)校验位的生成

2)校验过程

3)实例说明

三、串口设备使用示例

3.1、中断接收及轮询发送

3.2、DMA接收及轮询发送

四、串口接收不定长数据


一、UART简介

        UART(Universal Asynchronous Receiver/Transmitter)通用异步收发传输器,UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。是在应用程序开发过程中使用频率最高的数据总线。

        UART串口的特点是将数据一位一位地顺序传送,只要两根传输线就可以实现双向通信,一根线发送数据的同时用另一根线接收数据。UART串口通信有几个重要的参数,分别是波特率、起始位、数据位、停止位和奇偶校验位,对于两个使用UART串口通信的端口,这些参数必须匹配,否则通信将无法正常完成。UART串口传输的数据格式如下如所示:

1)起始位

        表示数据传输的开始,电平逻辑为“0”

2)数据位

        可能值有5、6、7、8、9,表示传输这个几个bit位数据。一般取值为8,因为有一个Ascii字符值为8位。

3)奇偶校验位

        用于接收方对接收到的数据进行校验,校验“1“的位数为偶数(偶校验)或奇数(奇校验)。以此来校验数据传送的正确性,使用时不需要此位也可以。不理解也没关系,在第二节会说明奇偶校验位的工作原理。

4)停止位

        表示一帧数据的结束。电平逻辑为“1“。

5)波特率        

        串口通信的速率,它用单位时间内传输的二进制代码的有效位(bit)数来表示,其单位为每秒比特数bit/s(bps)。常见的波特率值有4800、9600、14400、38400、115200等,数值越大数据传输越快,波特率为115200表示每秒传输115200位数据。

二、奇偶校验位的工作原理

1)校验位的生成

          奇校验:在数据中添加一个校验位,使得整个数据(包含校验位)中“1“的总数为奇数。

          偶校验:在数据中添加一个校验位,使得整个数据(包含校验位)中“1“的总数为偶数。

2)校验过程

          发送方在发送数据前,根据上述规则生成校验位,并将其附加在其中;

          接收方收到数据后,计算数据(包含校验位)中“1“的总数,检查其是否符合奇校验或偶校验的规则。如果不符合,则表明数据在传输过程中可能发生了错误。

3)实例说明

        假设传输一个8位数据11001100:

奇校验:

        原始数据中“1“的个数位4(偶数),因此校验位为1.

        传输的数据为11001100 1。

偶校验:

        原始数据中“1“的个数位4(偶数),因此校验位为0.

        传输的数据为11001100 0

接收方收到数据后,会根据校验规则检查数据的正确性。    

三、串口设备使用示例

3.1、中断接收及轮询发送

1)首先查找串口设备获取设备句柄

2)初始化回调函数发哦是那个使用的信号量,然后以读写及中断接收方式打开串口设备。

3)设置串口设备的接收回调函数,之后发送字符串,并创建读取数据线程。

          读取数据线程会禅师读取一个字符数据,如果没有数据则会挂起并等待信号量,当串口设备接收到一个数据时会触发中断并调用接收回调函数,此函数会发送信号量唤醒线程,此时线程会马上读取接收到的数据。

运行序列如下:

3.2、DMA接收及轮询发送

          当串口接收到一批数据后会调用接收回调函数,接收回调函数会把此时缓冲区的数据大小通过消息队列发送等待的数据处理线程。线程获取到消息后被激活,并读取数据。一般情况下DMA接收模式会结合DMA接受完成中断和串口空闲中断完成数据接收。

运行序列如下所示:

四、串口接收不定长数据

        串口接收不定长数据需要用户在应用层进行处理,一般会有特定的协议,比如一帧数据可能会有起始标记位、数据长度位、数据、终止标记位等。发送数据帧时按照约定的协议进行发送,接收数据时再按照协议进行解析。

        以下是一个简单的串口接收不定长数据示例代码,仅做了数据的结束标志位,如果遇到了结束标‘志,则表示一帧数据结束。示例代码主要步骤如下:

1)首先查找串口设备获取设备句柄。

2)初始化回调函数发送使用的信号量,然后以读写及中断接收方式打开串口设备。

3)设置串口设备的接收回调函数,之后发送字符串,并创建解析数据线程。

          解析数据线程会尝试读取一个字符数据,如果没有数据则会挂起并等待信号量,当串口设备接收到一个数据时会触发中断并调用接收回调函数,此函数会发送信号量唤醒线程,此时线程会马上读取到数据。在解析数据时,判断结束符,如果结束,则打印数据。

          当一帧数据长度超过最大长度时,这将是一帧不合格的数据,因为后面接收到的字符会覆盖第一个字符。


网站公告

今日签到

点亮在社区的每一天
去签到