>

嵌入式项目实践–多路温度采集控制系统(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;
    //设置串口通信速率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创客学堂】