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和蜂鸣器

五、总结

链路已经打通,在实际应用中,自然还需要增加串口协议。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来给您讲解一下。 首先,您需要连接一个51单片机到一个LED和一个蜂鸣器LED蜂鸣器的正极分别连接到单片机的一个GPIO引脚,负极连接到单片机的地。 接下来,您需要使用单片机的串口模块来控制LED蜂鸣器。您可以使用串口发送数据来控制LED蜂鸣器的开关。 下面是一个简单的代码示例,可以通过串口控制LED蜂鸣器的开关状态: ``` #include <reg52.h> sbit LED = P1^0; //定义LED连接的GPIO引脚 sbit BEEP = P1^1; //定义蜂鸣器连接的GPIO引脚 void main() { TMOD = 0x20; //设置定时器1为模式2,用于串口通信 TH1 = 0xFD; //设置波特率为9600 SCON = 0x50; //设置串口为模式1,允许接收和发送 TR1 = 1; //启动定时器1 while(1) { if(RI) //如果接收到数据 { RI = 0; //清除接收中断标志 switch(SBUF) //根据接收到的数据来控制LED蜂鸣器 { case '0': //关闭LED蜂鸣器 LED = 0; BEEP = 0; break; case '1': //打开LED LED = 1; break; case '2': //打开蜂鸣器 BEEP = 1; break; case '3': //同时打开LED蜂鸣器 LED = 1; BEEP = 1; break; default: //其他情况关闭LED蜂鸣器 LED = 0; BEEP = 0; break; } } } } ``` 在这个例子中,我们使用了串口通信来控制LED蜂鸣器的开关状态。当接收到字符'0'时,关闭LED蜂鸣器;当接收到字符'1'时,打开LED;当接收到字符'2'时,打开蜂鸣器;当接收到字符'3'时,同时打开LED蜂鸣器。其他情况下,关闭LED蜂鸣器。 希望这个例子能够对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值