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;
}