整个系统一共要采集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;
//设置串口通信速率B4800
if( 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 mode
options.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);
}
}
Copyright © 2016 www.91arm.com 【91创客学堂】