文章插图
串口驱动程序开发基本串口驱动程序实现思路从底层机制大体有两种一种是通过轮训机制,不断访问串口从而实现数据的收发,但是会导致cpu占用过高,第二种是使用中断或者DMA等技术实现串口的非实时读取,但是可以保证cpu占用率低并且保证数据有效 。
在上层应用层开发过程中有串口通信协议,需要进行校验位,数据位等需要进行规定 。
总体上开发过程分为四步:
- 制定设备间串口协议,波特率、数据位、停止位和校验位等 。在开发驱动之前,需要确认设备和设备之间所使用的串口通信协议,以便能够正确地配置和初始化串口 。
- 确认串口的硬件信息,保证串口硬件相同,底层物理特性一致,如不一致需要通过CP2102等芯片进行数据转换 。同时还需要确认单台设备串口的物理接口、I/O地址、中断号等 。
- 编写串口驱动程序,根据操作系统根据操作系统的要求,编写对应的驱动程序 。驱动程序需要包括串口的初始化、数据传输、中断处理等功能 。
- 测试和调试,完成驱动程序后完成驱动程序的编写后,需要进行测试和调试 。首先完成常规调用代码的实现,然后可以使用串口调试工具等工具对驱动程序进行测试,确认串口通信是否正常,数据是否正确传输等 。
文章插图
通常使用数据协议表格可以简单表示如下表
长度
功能
起始位
1位
标志帧的起始
数据位
8位 (有时描述为9位)
传输数据
校验位
无校验(1位奇校验/偶校验)
校验本帧数据正确性和完整性
停止位
1 (0.5 、1、 1.5、 2)
标志帧的结束
除了上述数据协议在通信双方需要完全一致外,还需要保证数据的传输速率一致,即波特率一致,波特率(Baud rate)是一种衡量数字通信中数据传输速率的单位,通常以每秒钟传输的比特数(bit per second,bps)为单位 。它指的是在数字通信中每秒钟传输的符号数,每个符号可以携带多个比特的信息 。
在串行通信中,波特率是指在传输数据时,串行线路上数据变化的速率 。例如,一个波特率为9600 bps的串行通信系统,可以在一秒钟内传输9600个符号,每个符号可以携带多个比特的信息 。波特率是通过调整串行通信系统中时钟信号的频率来实现的 。因此,波特率也可以理解为时钟频率的一种体现 。和时钟周期成倒数关系,总线时钟周期越短,单位时间传输的码元越多,串口波特率越高 。
需要注意的是,波特率并不等同于数据传输速率(data rate),因为每个符号可以携带多个比特的信息 。例如,一个波特率为9600 bps的串行通信系统,每个符号可以携带8个比特的信息,因此其数据传输速率为9600 bps × 8 = 76800 bps 。
常见的有 115200,38400,9600,4800等 。
使用外部中断实现的基本思路和逻辑常见的中断在前面的讲解中提到过包括定时器中断,外部硬件中断,系统异常中断,系统调用中断,信号中断,NMI中断,虚拟中断等,本节讨论的串口收发会涉及到的中断类型包括接收中断和空闲中断 。在大类上归属于外部硬件中断 。
使用LINUX依据空闲中断和接收中断实现串口收发的基本逻辑如下
打开串口操作会返回一个文件描述符,之后我们需要使用该文件描述符对串口进行读写操作 。配置串口参数的步骤会设置串口的输入输出波特率、数据位、停止位和校验位等参数,以保证通信的正确性和稳定性 。
接下来,串口硬件将接收到的数据存储在接收缓冲区中,并向内核发出中断信号 。中断处理函数根据中断类型(接收中断或空闲中断)选择相应的处理方式 。接收中断处理函数会将数据从接收缓冲区中读取并存储到tty缓冲区中,然后向应用程序发送SIGIO信号通知有数据可读 。应用程序监听SIGIO信号并从tty缓冲区中读取数据进行处理 。空闲中断处理函数类似,不同之处在于它不需要从接收缓冲区中读取数据,而是在空闲状态下触发中断并向应用程序发送SIGIO信号 。
推荐阅读
- 安徽医科大学研究生招生简章2021 安徽医科大学
- 德国大学研究生申请要求 德国大学排名
- 研究生压力大到崩溃 研究生跳楼
- 聊一聊OpenHarmony启动页后记
- 防水插头图片 防水公母插头
- 上海电缆研究所主办中国电线电缆网。上海电缆研究所待遇如何
- 山西大同大学研究生招生简章 上海大同大学
- 北邮|硕士研究生已经不值钱了?北邮2023的招聘,让人感到很无奈
- 中船系统工程研究院人大附中 船舶系统工程部
- 安徽农业大学研究生好考吗 安徽农业大学