2021-07-06 C语言 linux 串口 AT 及gps信号处理

1/处理包头
2/计数器计数
3/解包
4/设备类
5/特征码
6/
4/溢出?
5/发送

在这里插入图片描述

在这里插入图片描述

#include<stdio.h>    
#include<stdlib.h>  
#include<netinet/in.h>    
#include<sys/socket.h>    
#include<arpa/inet.h>    
#include<string.h>    
#include<unistd.h>    

#include<signal.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<termios.h>
#include<arpa/inet.h>
#include<pthread.h>

#include <sys/epoll.h>
#include <errno.h>
#include <fcntl.h>

//增加串口读数据操作
#define dev "/dev/ttyUSB1" //for U9300C longsung 

#define COM_BUFF_SIZE 512  
#define SOCKET_BUFFER_SIZE 1024 
//socket地址参数
#define cli_port 11127 
#define cli_ip "0.0.0.0"

int SectionID = 0, i = 0;

//定义GPS数据结构
static struct data{
char GPS_time[20]; //UTC 时间
char GPS_sv; //使用卫星
char GPS_wd[12]; //纬度
char GPS_jd[12]; //经度
//char GPS_warn; //定位警告
char GPS_speed[5];
char GPS_data[8]; //UTC日期
}GPS_DATA;  //GPS_DATA.GPS_time = 

//配置串口参数
static int set_com_config(int fd, int baud_rate, int data_bits, char parity, int stop_bits)
 {
 
 	struct termios new_cfg, old_cfg;

int speed; //保存并测试现有串口参数设置,在这里如果串口号出错, 会有相关的出错信息

if(tcgetattr(fd, &old_cfg)!=0)
{
	perror("tcgetattr");
	
	return -1;
}

tcflush(fd, TCIOFLUSH);

new_cfg = old_cfg;

cfmakeraw(&new_cfg); //配置为原始模式

new_cfg.c_cflag&=~CSIZE;

//设置波特率

switch(baud_rate)
{
	case 2400:
	{
		speed = B2400;
		break;
	}
	
	case 4800:
	{
		speed = B4800;
		break;
	}
	
	case 9600:
	{
		speed = B9600;
		break;
	}
	
	case 19200:
	{
		speed = B19200;
		break;
	}
	
	case 38400:
	{
		speed = B38400;
		break;
	}

   case  57600:
   {
        speed = B57600;
        break;
   }
	
	case 115200:
	{
		speed = B115200;
		break;
	}
}
	
	cfsetispeed(&new_cfg, speed);
	cfsetospeed(&new_cfg, speed);
	
	//设置数据位
	
	switch(data_bits)
	{
		case 7:
		{
			new_cfg.c_cflag|=CS7;
			break;
		}
		
		case 8:
		{
			new_cfg.c_cflag|=CS8;
			break;
		}			
	}
	
	//设置停止位
	switch(stop_bits)
	{
		case 1:
		{
			new_cfg.c_cflag&=~CSTOPB;
			break;
		}
		
		case 2:
		{
			new_cfg.c_cflag|=CSTOPB;
			break;
		}
	}
	
	//设置奇偶校验位
	switch(parity)
	{
		case 'o':
		case 'O':
		{
			new_cfg.c_cflag|=(PARODD|PARENB);
			new_cfg.c_cflag|=(INPCK|ISTRIP);
			break;
		}
		
		case 'e':
		case 'E':
		{
			new_cfg.c_cflag |=PARENB;
			new_cfg.c_cflag &=~PARODD;
			new_cfg.c_iflag |=(INPCK | ISTRIP);
			break;
		}
		
		case 's':
		case 'S':
		{
			new_cfg.c_cflag &=~PARENB;
			new_cfg.c_cflag &=~CSTOPB;
			break;
		}
		
		case 'n':
		case 'N':
		{
			new_cfg.c_cflag &=~PARENB;
			new_cfg.c_iflag &=~INPCK;
			break;
		}
	}
	
	new_cfg.c_cc[VTIME]=10;
	new_cfg.c_cc[VMIN]=5;
	
	//处理未接收的字符
	tcflush(fd, TCIFLUSH);
	
	if((tcsetattr(fd, TCSANOW, &new_cfg))!=0)
	{
		perror("tcsetattr");
		return -1;
	}
	
	return 0;
}

//打开串口	
 static int open_port(int fd)
{
	//int fd;

	if((fd=open(dev, O_RDWR|O_NOCTTY|O_NDELAY)) < 0)
	{
		perror("open serial port");
		return -1;
	}
	
	//恢复串口为堵塞状态
	if(fcntl(fd, F_SETFL, 0) < 0)
	{
		perror("fcntl F_SETFL\n");
		
		return -1;
	}
	
	//测试是否为终端设备
	if(isatty(STDIN_FILENO)==0)
	{
		perror("standard input is not a terminal device");			
	}
	
	return fd;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值