本文主要是介绍多路温度采集控制系统(6)串口采集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
嵌入式项目实践–多路温度采集控制系统(6)串口采集
串口采集温度数据
整个系统一共要采集4路温度数据,其中1、2路为串口采集。
因为只使用一个51单片机温湿度采集模块,程序中就实现一个串口采集线程。
注:如果没有真实的串口采集模块,可以在PC机编写串口程序产生随机数据模拟,但要使用USB串口线连接开发板的 ttySAC1、ttySAC2、 ttySAC3其中一个串口。
while(1){if(read(fd_com1,data,1)>0){g_dev->temp_data[0]= data[0];//printf("#temp=%d\n",data[0]);} sleep(2);}
串口采集程序代码
头文件
#ifndef __TC9000_COM_H_
#define __TC9000_COM_H_#define UART "/dev/ttySAC3" //同单片机通信B4800 8 n 1 int init_com(int fd);//初始化串口
void* com1_pro(void* arg);//串口处理线程#endif
串口线程
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <pthread.h>
#include <termios.h> #include "config.h"
#include "com_pro.h"extern struct st_sys g_dev[1]; //系统配置结构体全局变量int init_com(int fd)
{struct termios options;//设置串口通信速率B4800if( tcgetattr( fd,&options) != 0){return(-1);} cfsetispeed(&options, B4800);cfsetospeed(&options, B4800);//设置数据位8位 options.c_cflag &= ~CSIZE;options.c_cflag |= CS8; //设置无校验options.c_cflag &= ~PARENB; options.c_iflag &= ~INPCK; //设置停止位1位options.c_cflag &= ~CSTOPB; //raw modeoptions.c_lflag &= ~(ICANON|ECHO|ECHOE|ISIG);options.c_oflag &= ~OPOST;options.c_cc[VTIME] = 0; options.c_cc[VMIN] = 0; tcflush(fd,TCIFLUSH); //向系统提交新的串口设置参数 if (tcsetattr(fd,TCSANOW,&options) != 0){return (-1);} return 0;
}void* com1_pro(void* arg)
{int fd_com1=-1;unsigned char data[2];printf("com3 recv pthread start...\n");fd_com1 = open(UART,O_RDWR|O_NONBLOCK|O_NOCTTY|O_NDELAY); if(fd_com1 < 0){printf("Can't Open Serial Port1!\n");pthread_exit("0"); } if(init_com(fd_com1) < 0){printf("Serial1 Init error!\n");pthread_exit("0"); } g_dev->status[0] = 1;printf("com3\n");while(1){if(read(fd_com1,data,1)>0){g_dev->temp_data[0]= data[0];//printf("#temp=%d\n",data[0]);} sleep(2);}
}
这篇关于多路温度采集控制系统(6)串口采集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!