准备
在原有的GVINS程序中加入“Serial_Port.cpp”和 “Serial_Port.h”模块,对应的部分也要改变 !
一、“Serial_Port.cpp”程序
#include "Serial_Port.h"
// 传输数字时,把数字转成字符!
void Serial_port_send_data(char w_buf[128])
{
int tty_fd = -1 ;
int rv = -1 ;
struct termios options;
/*
可采用下面的文件打开模式:
O_RDONLY:以只读方式打开文件
O_WRONLY:以只写方式打开文件
O_RDWR: 以读写方式打开文件
*/
// /dev/ttyUSB0,串口名字,看自己的串口名字是啥,对应着改 !
// tty_fd = open("/dev/ttyUSB0",O_RDWR|O_NOCTTY|O_NDELAY) ; //打开串口设备
tty_fd = open("/dev/pts/2",O_RDWR|O_NOCTTY|O_NDELAY) ;
if(tty_fd < 0)
{
printf("open tty failed:%s\n", strerror(errno)) ;
goto cleanup ;
}
printf("open devices sucessful!\n") ;
memset(&options, 0, sizeof(options)) ;
rv = tcgetattr(tty_fd, &options); //获取原有的串口属性的配置
if(rv != 0)
{
printf("tcgetattr() failed:%s\n",strerror(errno)) ;
goto cleanup ;
}
options.c_cflag|=(CLOCAL|CREAD ); // CREAD 开启串行数据接收,CLOCAL并打开本地连接模式
options.c_cflag &=~CSIZE; // 先使用CSIZE做位屏蔽
options.c_cflag |= CS8; //设置8位数据位
options.c_cflag &= ~PARENB; //无校验位
/* 设置115200波特率 */
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
options.c_cflag &= ~CSTOPB; // 设置一位停止位;
options.c_cc[VTIME] = 0; // 非规范模式读取时的超时时间;
options.c_cc[VMIN] = 0; //非规范模式读取时的最小字符数
tcflush(tty_fd ,TCIFLUSH);/* tcflush清空终端未完成的输入/输出请求及数据;TCIFLUSH表示清空正收到的数据,且不读取出来 */
if((tcsetattr(tty_fd, TCSANOW,&options))!=0)
{
printf("tcsetattr failed:%s\n", strerror(errno));
goto cleanup ;
}
// while(1)
// {
rv = write(tty_fd, w_buf,strlen(w_buf)) ;
if(rv < 0)
{
printf("Write() error:%s\n",strerror(errno)) ;
goto cleanup ;
}
// sleep(3) ;
// }
cleanup:
close(tty_fd) ;
}
注意:
tty_fd = open("/dev/pts/2",O_RDWR|O_NOCTTY|O_NDELAY) ;
"/dev/pts/2" 是我自己生成的虚拟端口,你要把数据写入这个串口中,然后去看这个串口打印的信息对不对!
虚拟端口生成的博客:
二、“Serial_Port.h”程序
#ifndef SERIAL_PORT_H
#define SERIAL_PORT_H
#include <stdio.h> // 标准输入输出定义
#include <string.h> // 字符串功能函数
#include <errno.h> // 错误号定义
#include <unistd.h> // Unix 标准函数定义
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> // 文件控制定义
#include <termios.h> // POSIX 终端控制定义
/*
主要流程 :
1、open打开串口设备,获取串口设备文件描述符(Linux一切都是文件~);
2、设置波特率、数据位、停止位、校验位等;
3、read()、write()操作文件描述符进行串口通信;
4、close()关闭设备;
串口驱动的默认属性值(9600,8n1,无流控),最重要的同时也是最复杂的就是第二步串口的设置,所以先说open()、read()、write()、close()对串口的操作。
*/
void Serial_port_send_data(char w_buf[128]);
#endif
三、"visualization.cpp" 下面的 "pubGnssResult" 程序
// ---------------------- 串口数据传输程序 --------------------//
char w_buf_time[50],w_buf_lat[50],w_buf_lon[50],w_buf_alt[50];
double lat,lon,alt;
lat = anc_lla.x();
lon = anc_lla.y();
alt = anc_lla.z();
if( Serial_port_open ==1 )
{
// double 到 char的转换 !
sprintf(w_buf_time,"%.3lf",time); // 时间信息
sprintf(w_buf_lat,"%.10lf",lat); // 经度
sprintf(w_buf_lon,"%.10lf",lon); // 纬度
sprintf(w_buf_alt,"%.10lf",alt); // 高度
// 串口发送 !
Serial_port_send_data(w_buf_time);
Serial_port_send_data(douhao); // 逗号
Serial_port_send_data(w_buf_lat);
Serial_port_send_data(douhao); // 逗号
Serial_port_send_data(w_buf_lon);
Serial_port_send_data(douhao); // 逗号
Serial_port_send_data(w_buf_alt);
}
// ---------------------- 串口数据传输程序 --------------------//
其中,
int Serial_port_open = 1;
#define douhao ","
串口打印结果