其他分享
首页 > 其他分享> > GVINS的导航信息通过串口进行传输

GVINS的导航信息通过串口进行传输

作者:互联网

准备

在原有的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" 是我自己生成的虚拟端口,你要把数据写入这个串口中,然后去看这个串口打印的信息对不对!

虚拟端口生成的博客:

Linux下 虚拟串口的生成(程序)_努力努力努力-CSDN博客

二、“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   ","

串口打印结果

 

标签:tty,GVINS,port,传输,串口,Serial,buf,options
来源: https://blog.csdn.net/hltt3838/article/details/122419418