温度Linux 串口监测实时温度数据(linux串口获取)
温度是大多数应用场景中最常使用的物理参数,尤其是电子产品的安全性实验和电子设备的使用环境检测时,体现了温度的重要性。Linux串口监测实时温度数据可以使用一定的C语言程序来实现。
1. 设备准备
首先,我们需要准备:Linux设备,USB转TTL线,温度传感器(DHT11)。Linux设备用来接收传感器数据;USB转TTL线用以连接传感器与设备;温度传感器用来检测气温,这里我们采用DHT11作为传感器。
2. 连接设备
温度传感器DHT11有四根线:Vcc,Data,GND,NC。其中Vcc接5V,Data接USB转TTL线的RX,GND接GND,NC接无。然后将USB转TTL线的TX连接Linux设备的TTY。
3. 编写程序
程序的主要流程分为以下几部分:(1)声明变量:“temp, humi”,用来存放读取的温湿度,“fd”用来存放文件描述符;(2)打开串口:函数“open”用于打开文件描述符;(3)设置串口参数:函数“tcsetattr”用于设置串口参数;(4)读取温湿度:函数“read”用于读取传感器数据;(5)打印温湿度:函数“printf”用于打印温湿度信息;(6)关闭串口:函数“close”用于关闭文件描述符。
具体代码如下:
#include
#include
#include
#include
int open_serial_port()
{
int fd;
struct termios t_opt;
/*打开串口*/
fd=open(“/dev/ttyUSB0”, O_RDWR | O_NOCTTY | O_NDELAY);
if(-1 == fd)
{
printf(“Open Serial Port Error/n”);
return -1;
}
else
printf(“Open Serial Port Success/n”);
/*波特率设置*/
tcgetattr(fd, &t_opt);
cfsetispeed(&t_opt, B9600);/*设置输入波特率*/
cfsetospeed(&t_opt, B9600);/*设置输出波特率*/
/*数据位*/
t_opt.c_cflag &= ~CSIZE;
t_opt.c_cflag |= CS8;
/*规避奇偶位校验*/
t_opt.c_cflag &= ~PARENB;
/*无硬件流控*/
t_opt.c_cflag &= ~CNEW_RTSCTS;
/*使能接收*/
t_opt.c_cflag |= CREAD | CLOCAL;
/*屏蔽其他标志位*/
t_opt.c_cflag &= ~CRTSCTS;
t_opt.c_cflag &= ~CSIZE;
t_opt.c_cflag &= ~CSIZE;
/*关闭流控制*/
t_opt.c_lflag &=~(ICANON | ECHO | ECHOE | ISIG);
/*激活配置使其生效*/
/*设置等待时间和最小接受字符*/
t_opt.c_cc[VTIME] = 0;
t_opt.c_cc[VMIN] = 1;
/*如果发生数据溢出,接收数据,但是不再读取*/
tcflush(fd, TCIFLUSH);
if(tcsetattr(fd, TCSANOW, &t_opt))
{
perror(“Set Serial Attribute Error”);
return -1;
}
return fd;
}
float read_dht11(int fd)
{
unsigned char humi_h,humi_l;
unsigned char temp_h,temp_l;
int tme=100000;
unsigned char humi,temp;
int i;
float fhumi,ftemp;
unsgined char buf[5]
write(fd,”H”,1);
while(1)
{
usleep(tme);
if(0
{
humi_l=buf[0];
humi_h=buf[1];
temp_l=buf[2];
temp_h=buf[3];
break;
}
}
temp=temp_l;
humi=humi_l;
int sum=buf[4];
if(sum==(humi+temp_h+humi_h+temp_l))
{
printf(“temperature is : %d \nhumidity is : %d \n”,temp,humi);
fhumi=(float)humi;
ftemp=(float)temp;
return ftemp;
}
else
{
printf(“data error\n”);
return -1;
}
}
int main(int argc,char **argv)
{
int fd=open_serial_port();
while(1)
{
float temp = read_dht11(fd);
printf(“the temp is %f\n”,temp);