Linux系统编程四:串口编程,控制LED和蜂鸣器
Posted 何事误红尘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统编程四:串口编程,控制LED和蜂鸣器相关的知识,希望对你有一定的参考价值。
一、概述
串口通信是非常多用到的通信方式之一,这篇文章就记录下Linux下的串口编程。在这一节的实验中,将通过串口控制LED和蜂鸣器。(虽然是分模块学习,但做实验时,尽量将模块结合起来。慢慢切合实际应用,避免单个的模块demo,零落成泥不成型。)
在上一篇的点灯实验,已经了解到设备节点的概念,串口本质上也是字符设备。可以想到,串口同样需要使用几个文件IO。大致过程如下:
文件IO在上一篇已经有所了解,重点在于配置串口参数的过程。也就是流程图的第二步。
二、串口初始化
串口初始化主要包括波特率、数据位、停止位、奇偶校验。在单片机编程时,或者将参数写入不同的寄存器,或者使用库函数,赋值到结构体的不同元素,再init一下。Linux大体上也是如此:
2.1 读取当前串口的参数
这一步主要是检测串口是否可以用,参数被保存在结构体termios
中。函数原型为:
#include <termios.h>
#include <unistd.h>
int tcgetattr(int fd, struct termios *termios_p);
参数结构体
查看下内核源码的定义:
#define NCC 8
struct termio {
unsigned short c_iflag; /* input mode flags */
unsigned short c_oflag; /* output mode flags */
unsigned short c_cflag; /* control mode flags */
unsigned short c_lflag; /* local mode flags */
unsigned char c_line; /* line discipline */
unsigned char c_cc[NCC]; /* control characters */
};
几个成员分别是输入模式、输出模式、控制模式、本地模式、线描述、控制字符。在单片机HAL库编程时,不同成员分别代表了波特率、数据位、停止位、奇偶校验等。在termio
中并没有相应成员,而是通过控制模式c_cflag的不同bit来设置。这里先在程序中粗略体会下,用起来。后面学到内核,再展开了解。
2.2 波特率相关的函数
Linux下设置波特率分为两个函数,原型如下:
#include <termios.h>
#include <unistd.h>
int cfsetispeed(struct termios *termios_p, speed_t speed);
int cfsetospeed(struct termios *termios_p, speed_t speed);
从函数命名可以看出一个是in,一个是out。使用时设置成相同的速率即可。
获取波特率的函数同样有两个:
#include <termios.h>
#include <unistd.h>
speed_t cfgetispeed(const struct termios *termios_p);
speed_t cfgetospeed(const struct termios *termios_p);
2.3 清空串口缓存
用于清空串口中没有完成的输入或者输出数据。在接收或者发送数据的时候,串口寄存器会缓存数据,这个函数用于清除这些数据。
#include <termios.h>
#include <unistd.h>
int tcflush(int fd, int queue_selector);
queue_selector的常用值有三个:
TCIFLUSH 清除正收到的数据,且不会读取出来;
TCOFLUSH 清除正写入的数据,且不会发送至终端;
TCIOFLUSH 清除所有正在发生的 I/O 数据。
2.4 设置串口参数
函数原型为:
#include <termios.h>
#include <unistd.h>
int tcsetattr(int fd, int optional_actions,const struct termios *termios_p);
optional_actions 是参数生效的时间,同样有三个常用的值:
TCSANOW:不等数据传输完毕就立即改变属性;TCSADRAIN:等待所有数据传输结束才改变属性;TCSAFLUSH:清空输入输出缓冲区才改变属性。
三、串口通信
查找设备节点
在 4412 开发板中,设备节点使用的是 ttySAC*系列,即 ttySAC0,ttySAC1,ttySAC2,ttySAC3。
iTOP-4412 开发板可以支持 4 个串口,如下图所示,方便用户使用的除了控制台(超级终端使用的串口)以外,精英版靠近麦克和耳机的串口,也是可以直接拿来使用的。
四、控制LED和蜂鸣器
五、总结
链路已经打通,在实际应用中,自然还需要增加串口协议。
以上是关于Linux系统编程四:串口编程,控制LED和蜂鸣器的主要内容,如果未能解决你的问题,请参考以下文章