ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-10 21:31:22  阅读:259  来源: 互联网

标签:tty GVINS port 传输 串口 Serial buf options


准备

在原有的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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有