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和蜂鸣器的主要内容,如果未能解决你的问题,请参考以下文章

单片机远程控制步进电机LED灯和蜂鸣器

Linux ~ termios 串口编程

单片机实验串口通信实验

Linux 蜂鸣器实验

IDE中安装两个Ardublock

关于QT串口编程与单片机通信的问题,单片机为STM32