最近在做Linux下的串口接收并处理GPS数据,那对于是新手的我来说,就将这个项目分成两步,第一,接收数据,第二,处理数据。本文注重第二步的代码实现,第一步只会简单提及。本文使用的嵌入式开发板龙芯智龙1C,GPS模块采用的是正点原子的ATK-S1216F8-BD模块。
第一,接收数据:在配置好开发板的串口及相关硬件后,使用cat /dev/ttyS1能将串口接收到的GPS数据打印在控制台上。模块连接图如下:
若控制台上能够显示GPS数据,则开始第二步。
第二,处理数据:
(1).串口操作:Linux下编程的过程有些固定,很多都是比如打开、配置、关闭等等
串口通信流程:打开串口ttySn—>初始化串口—>读写(read、write)—>关闭串口。
以下是usart.h代码实现:
#ifndef __USART_H
#define __USART_H
#include<stdio.h> /*标准输入输出定义*/
#include<stdlib.h> /*标准函数库定义*/
#include<unistd.h> /*Unix 标准函数定义*/
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h> /*文件控制定义*/
#include<termios.h> /*PPSIX 终端控制定义*/
#include<errno.h> /*错误号定义*/
#include<string.h>
#define SERIAL1 "/dev/ttyS1"
#define SERIAL3 "/dev/ttyS3"
int UART_Open(int fd, char *port);
void UART_Close(int fd);
int UART_Set(int fd, int speed, int flow_ctrl, int databits, int stopbits, char parity);
int UART_Init(int fd, int speed, int flow_ctrl, int databits, int stopbits, char parity) ;
int UART_Recv(int fd, char *rcv_buf, int data_len);
int UART_Send(int fd, char *send_buf, int data_len);
#endif
usart.c代码实现:
#include "usart.h"
//fd:串口文件描述符 port:串口号(/SERIAL1/SERIAL3)
int UART_Open(int fd, char *port)
{
fd = open(port, O_RDWR|O_NOCTTY|O_NDELAY);
if(fd < 0)
{
perror("Can't Open Serial Port:");
return -1;
}
//恢复串口为阻塞状态
if(fcntl(fd, F_SETFL, 0) < 0)
{
printf("fcntl failed!\n");
return -1;
}
else
{
printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
}
//测试是否为终端设备
if(0 == isatty(STDIN_FILENO))
{
printf("standard input is not a terminal device\n");
return -1;
}
else
{
printf("isatty success!\n");
}
printf("fd->open=%d\n",fd);
return fd;
}
void UART_Close(int fd)
{
close(fd);
}
/*******************************************************************
*名称: UART_Set
*功能: 设置串口数据位,停止位和效验位
*入口参数: fd 串口文件描述符
* speed 串口速度
* flow_ctrl 数据流控制
* databits 数据位 取值为7或者8
* stopbits 停止位 取值为1或者2
* parity 效验类型 取值为N,E,O,S
*******************************************************************/
int UART_Set(int fd, int speed, int flow_ctrl, int databits, int stopbits, char parity)
{
int i;
int status;
int speed_arr[] = { B1152