6.串口通信和传感器的使用----粤嵌gec6818开发板上实现智能家居(光照气度,压强,海拔,湿度,温度达到临界值蜂鸣器自动警报等)

2024-07-12 1334阅读

一、串口通信及传感器数据采集

1.串口及初始化

串口是一种简单的通信接口,也是单片机中最常用,最简单的通信方式

通常传感器都是采用串口作为与上位机的通信接口

ARM板上提供了三个可以外接传感器的串口接口,位于开发板的右上角,

从上到下分别是:

​ 串口号 串口驱动设备文件名

​ CON2 “/dev/ttySAC1”

​ CON3 “/dev/ttySAC2”

​ CON4 “/dev/ttySAC3”

我们将传感器链接到对应的串口端口以后,在Linux中通过串口通信去获取该传感器的数据极其简单

只需要先打开串口设备文件,并将串口进行初始化配置,就可以调用write函数发送数据给传感器,调用read函数从传感器中获取数据

串口的初始化函数如下:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include  //串口配置需要的头文件
/*
 *	init_serial:自定义的用来打开串口文件并对串口进行初始化的函数
 *	arg:
 *		@fild:串口设备文件名,指定您要使用的串口
 *		@baudrate:整数,指定您要配置的串口的通信波特率
 *			9600/115200/19200
 *	配置的串口协议:数据位8,停止位1,不要校验,不要硬件控制流
 *	return:
 *		成功,返回打开 并初始化好的 串口的文件描述符,后期根据该返回值来与链接在该串口上的传感器进行通信
 *		失败返回-1
 **/
int init_serial(const char *file, int baudrate)
{ 
	int fd;
	
	fd = open(file, O_RDWR);
	if (fd == -1)
	{
		perror("open device error:");
		return -1;
	}
	struct termios myserial;
	//清空结构体
	memset(&myserial, 0, sizeof (myserial));
	//O_RDWR               
	myserial.c_cflag |= (CLOCAL | CREAD);
	//设置控制模式状态,本地连接,接受使能
	//设置 数据位
	myserial.c_cflag &= ~CSIZE;   //清空数据位
	myserial.c_cflag &= ~CRTSCTS; //无硬件流控制
	myserial.c_cflag |= CS8;      //数据位:8
	myserial.c_cflag &= ~CSTOPB;//   //1位停止位
	myserial.c_cflag &= ~PARENB;  //不要校验
	//myserial.c_iflag |= IGNPAR;   //不要校验
	//myserial.c_oflag = 0;  //输入模式
	//myserial.c_lflag = 0;  //不激活终端模式
	switch (baudrate)
	{
		case 9600:
			cfsetospeed(&myserial, B9600);  //设置波特率
			cfsetispeed(&myserial, B9600);
			break;
		case 115200:
			cfsetospeed(&myserial, B115200);  //设置波特率
			cfsetispeed(&myserial, B115200);
			break;
		case 19200:
			cfsetospeed(&myserial, B19200);  //设置波特率
			cfsetispeed(&myserial, B19200);
			break;
	}
	/* 刷新输出队列,清楚正接受的数据 */
	tcflush(fd, TCIFLUSH);
	/* 改变配置 */
	tcsetattr(fd, TCSANOW, &myserial);
	return fd;
}

常见的串口传感器,通信方式一般有两种:

1 配置式通信:上位机只需要发送一次配置命令给传感器,传感器就会周期性采集并返回数据回复给上位机

比如:GY-39

2.询问式通信:上位机发送一次命令给传感器,传感器就会采集并返回一次数据给上位机,直到下一次上位机再发送命令,传感器彩虹再一次采集回复数据==》上位机每发送一次指令,才能获取一次数据 ==》烟雾传感器

int main(void)
{
	int gy39_fd = 0;
	gy39_fd = init_serial("/dev/ttySAC1",9600);
	read(gy39_fd,...,...);//从gy39中读取数据存入到...
	write(gy39_fd,...,...);往gy_39里面写入...
}

在使用串口与传感器通信,来获取传感器采集到的数据时,我们必须能够熟练地阅读传感器的使用手册

2.GY-39的使用

接线引脚

6.串口通信和传感器的使用----粤嵌gec6818开发板上实现智能家居(光照气度,压强,海拔,湿度,温度达到临界值蜂鸣器自动警报等)

​ VCC:电源正极,接上位机的5v(vcc)

​ CT(UART_TX):串口数据发送端,接上位机的RX引脚

​ DR(UART_RX):串口数据接收端,接上位机的TX引脚

​ GND:电源接地,接上位机的GND

通信协议

命令

命令是由上位机发送给GY-39传感器的,用来告诉GY-39本次需要采集那些数据

GY-39的命令由三个字节组成:

指令格式:帧头+指令+校验和(8bit)

帧头:固定0xa5,表示一帧命令的开始

指令:表示命令码,8bit,不同的bit有不同的含义

校验和:前面两个字节的和,只取低8位

6.串口通信和传感器的使用----粤嵌gec6818开发板上实现智能家居(光照气度,压强,海拔,湿度,温度达到临界值蜂鸣器自动警报等)

eg:

unsigned char cmd[3]={0xa5,0x81,0x26};
write(gy39_fd,cmd,3);//发送获取光强的命令给GY-39,之后GY-3会周期性给上位机回复光强数据

回复数据:

6.串口通信和传感器的使用----粤嵌gec6818开发板上实现智能家居(光照气度,压强,海拔,湿度,温度达到临界值蜂鸣器自动警报等)

6.串口通信和传感器的使用----粤嵌gec6818开发板上实现智能家居(光照气度,压强,海拔,湿度,温度达到临界值蜂鸣器自动警报等)

6.串口通信和传感器的使用----粤嵌gec6818开发板上实现智能家居(光照气度,压强,海拔,湿度,温度达到临界值蜂鸣器自动警报等)

读取GY-39的回复数据,有两种方式

1.简单粗暴

发送光强命令0x81,读取9字节

发送气象命令0x82,读取15字节

发送光强+气象数据0x83,读取15+9个字节

这种读取方式,前提是上位机与GY-39的通信必须一直稳定,不能出现误传

2.一个字节一个字节的读取,根据通信协议中数据帧的格式来边解析边读取数据

int gy39_getlux(void)
{
	int gy39_fd = 0;
	int i = 0;
	ssize_t rsize = 0;
	unsigned char cmd[3]={0xa5,0x81,0x26};
	unsigned char buf[25]={0};
	
	gy39_fd = init_serial("/dev/ttySAC1",9600);
	write(gy39_fd,cmd,3);//发送获取光强的命令给GY-39,之后GY-3会周期性给上位机回复光强数据
	while(1)
	{
		rsize = read(gy39_fd,buf,9);
		if (rsize == 9)
		{
			printf("GY-39 lux buffer:\n");
			for ( i = 0; i  

6.串口通信和传感器的使用----粤嵌gec6818开发板上实现智能家居(光照气度,压强,海拔,湿度,温度达到临界值蜂鸣器自动警报等)

int gy39_lux(void)
{
	int i = 0;
	int lux = 0;
	int gy39_fd = 0;
	ssize_t rsize = 0;
	unsigned char cmd[3]={0xa5,0x81,0x26};//命令数组帧头、指令、校验和(8bit)
	unsigned char buf[25]={0};//缓存数组保存从传感器返回的数据
	gy39_fd =init_serial("/dev/ttySAC1",9600);
	write(gy39_fd,cmd,3);//发送读取光强的命令,GY-39开始周期性的回复光强数据
	
		rsize=read(gy39_fd,buf,9);
		if (rsize = 9&&buf[2]=0x15)//数据帧9bit且byte2=0x15
		{
			lux=(buf[4]&0xff)
	int fd,ret;
	char beep_ctrl[1]; //0 -- 不响  1 ---响
	
	//[1]打开蜂鸣器的驱动设备文件
	fd = open("/dev/pwm",O_RDWR);
	if(fd 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]