4412_linux串口应用编程
总阅读次
在单片机串口编程中,用户对寄存器以及串口中断进行操作。但在Linux系统中底层内核驱动以及对寄存器的操作都是写好的.多驱动工程师来说是完全不需要手动去写串口驱动的.
串口驱动也是一种很特殊的字符驱动,
linux串口应用编程,直接使用原厂提供的接口,主要进行初始化配置以及发送和接收。
基础知识
串口通信
一次只传一个数据位,一个bit一个bit发送数据。串口通讯有7位、8位、9位但是在物理层面传输的时候它仍然是以bit为单位来发送的,串口底层寄存器每次只接收一个bit单位。
什么是串口?
在嵌入式串口特指RS232的针脚定义。RS232是EIA制定的串行数据通信的接口标准。以太网、USB也是串口
RS232的针脚定义
分25针和8针2种定义。什么是流控?
2个串行接口传输数据要协调一致才行。
[串口流控 软件流控与硬件流控][]
流程分析
.
打开串口
串口初始化
- 读取当前参数
- 修改参数
- 配置参数
串口初始化数据结构(内核中)
1 | struct termio { |
读取当前参数函数
1 | int tcgetattr(int fd, struct termios *termios_p); |
termios_p指termio结构体
一般在串口初始化调用该函数
获取当前波特率的函数
1 | speed_t cfgetispeed(const struct termios *termios_p); //获取输入的波特率 |
termios_p指termio结构体
失败返回-1;成功则返回波特率
设置波特率函数
1 | int cfsetispeed(struct termios *termios_p, speed_t speed); |
参数speed:speed波特率,常用的B2400,B4800,B9600,B115200,B460800等等。
执行成功返回0,失败返回-1
清空串口BUFFER中的数据函数
1 | int tcflush(int fd, int queue_selector); |
参数2:控制tcflush的操作。有3个常用数值,TCIFLUSH清除正在收到的数据,且不会读出来;TCOFLUSH清除正写入的数据,且不会发送至终端;TCIOFLUSH清除所有正在发生的I/O数据。
执行成功返回0,失败返回-1
设置串口参数函数
1 | int tcsetattr(int fd,int optional_actions,const struct termios *termios_p); |
- 参数optional_actions:参数生效的时间。有3个常用值:
TCSANOW:不等数据传输完毕就立刻改变属性;
TCSADRAIN:等待所有数据传输结束才改变属性;
TCSAFLUSH:清空输入输出缓冲区才改变属性。
- 参数*termios_p:在就参数的基础长修改该后的参数
- 返回值:执行成功后返回0,失败返回-1
- 一般在初始化最后会使用这个函数。
发送数据
demo程序:串口发送
1 |
|
运行结果
接收数据
1 |
|
运行结果:
Tips
第九章有写如何配置 已在使用的串口
linux看串口号:
通过echo发消息给串口
1 | echo -n "abc" > /dev/ttyS1 |