往期内容
本专栏往期内容:Uart子系统
interrupt子系统专栏:
- 专栏地址:interrupt子系统
- Linux 链式与层级中断控制器讲解:原理与驱动开发
– 末片,有专栏内容观看顺序pinctrl和gpio子系统专栏:
专栏地址:pinctrl和gpio子系统
编写虚拟的GPIO控制器的驱动程序:和pinctrl的交互使用
– 末片,有专栏内容观看顺序
input子系统专栏:
- 专栏地址:input子系统
- input角度:I2C触摸屏驱动分析和编写一个简单的I2C驱动程序
– 末片,有专栏内容观看顺序I2C子系统专栏:
- 专栏地址:IIC子系统
- 具体芯片的IIC控制器驱动程序分析:i2c-imx.c-CSDN博客
– 末篇,有专栏内容观看顺序总线和设备树专栏:
- 专栏地址:总线和设备树
- 设备树与 Linux 内核设备驱动模型的整合-CSDN博客
– 末篇,有专栏内容观看顺序
目录
前言
建议先看下本专栏前两篇对串口基础知识的讲解
本文详细讲解了Linux设备编程的核心知识点,涵盖了UART通信、GPS模块数据处理和字符设备驱动开发的两种注册方法。在UART通信部分,介绍了设备操作的基本流程以及如何通过termios结构体配置串口参数。在GPS模块实验中,解析了NMEA0183数据格式,展示了如何提取关键定位信息及实现硬件通信。在字符设备驱动开发部分,阐述了传统register_chrdev和改进的cdev注册方法,结合实例代码和流程图,分析了资源分配和驱动管理的优化策略。
1.回环实验_自发自收
在Linux系统中,操作设备的统一接口就是:open/ioctl/read/write。
对于UART,又在ioctl之上封装了很多函数,主要是用来设置行规程。
所以对于UART,编程的套路就是:
- open
- 设置行规程,比如波特率、数据位、停止位、检验位、RAW模式、一有数据就返回
- read/write
1.1 API和结构体
怎么设置行规程?行规程的参数用结构体termios来表示
这些函数在名称上有一些惯例:
- tc:terminal contorl
- cf: control flag
下面列出一些函数:
函数名 | 作用 |
---|---|
tcgetattr | get terminal attributes,获得终端的属性 |
tcsetattr | set terminal attributes,修改终端参数 |
tcflush | 清空终端未完成的输入/输出请求及数据 |
cfsetispeed | sets the input baud rate,设置输入波特率 |
cfsetospeed | sets the output baud rate,设置输出波特率 |
cfsetspeed | 同时设置输入、输出波特率 |
函数不多,主要是需要设置好termios中的参数。