Pixhawk与树莓派3的串口通信

2023-05-16

新建主题

  • msg文件夹下新建mytopic.msg文件

        char[4] datastr0  //字符串的写法 存放发送过来的字符串
        uint8 data//将字符串转换成整型   
    
  • 在msg文件夹中的cmkaelist文件中加入
    这里写图片描述

新建pi_uart模块

  • 在src目录的modules文件夹下新建pi_uart文件夹
  • 在pi_uart文件夹下新建pi_uart.c
  • 实现的功能:
    • 开机自启动
    • 持续接收串口数据(’R’开头的字符串)
    • 发送串口数据
    • 将接收到的数据更新发布到mytopic主题中
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <stdbool.h>
#include <errno.h>
#include <drivers/drv_hrt.h>
#include <uORB/topics/mytopic.h>
#include <uORB/uORB.h>

#include <px4_config.h>
#include <px4_getopt.h>

#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>
#include <math.h>
#include <poll.h>
#include <time.h>
#include <math.h>

#include <nuttx/sched.h>

#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>


#include <systemlib/param/param.h>
#include <systemlib/err.h>
#include <systemlib/perf_counter.h>
#include <systemlib/systemlib.h>
#include <systemlib/mcu_version.h>
#include <systemlib/git_version.h>
#include <systemlib/mavlink_log.h>
#include <geo/geo.h>
#include <dataman/dataman.h>


static bool thread_should_exit = false;
static bool thread_running = false;
static int daemon_task;


__EXPORT int pi_uart_main(int argc, char *argv[]);
int pi_uart_thread_main(int argc, char *argv[]);
static void usage(const char *reason);

static int uart_init(char * uart_name);
static int set_uart_baudrate(const int fd, unsigned int baud);

static void usage(const char *reason)
{
    if (reason) {
        fprintf(stderr, "%s\n", reason);
    }

    fprintf(stderr, "usage: position_estimator_inav {start|stop|status} [param]\n\n");
    exit(1);
}

int set_uart_baudrate(const int fd, unsigned int baud)
{
    int speed;

    switch (baud) {
        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;
       // default:
            //warnx("ERR: baudrate: %d\n", baud);
            return -EINVAL;
    }

    struct termios uart_config;

    int termios_state;

    /* fill the struct for the new configuration */
    tcgetattr(fd, &uart_config);
    /* clear ONLCR flag (which appends a CR for every LF) */
    uart_config.c_oflag &= ~ONLCR;
    /* no parity, one stop bit */
    uart_config.c_cflag &= ~(CSTOPB | PARENB);
    /* set baud rate */
    if ((termios_state = cfsetispeed(&uart_config, speed)) < 0) {
        warnx("ERR: %d (cfsetispeed)\n", termios_state);
        return false;
    }

    if ((termios_state = cfsetospeed(&uart_config, speed)) < 0) {
        warnx("ERR: %d (cfsetospeed)\n", termios_state);
        return false;
    }

    if ((termios_state = tcsetattr(fd, TCSANOW, &uart_config)) < 0) {
        warnx("ERR: %d (tcsetattr)\n", termios_state);
        return false;
    }

    return true;
}

int uart_init(char * uart_name)
{
    int serial_fd = open(uart_name, O_RDWR | O_NOCTTY);

    if (serial_fd < 0) {
        err(1, "failed to open port: %s", uart_name);
        return false;
    }
    return serial_fd;
}

int pi_uart_main(int argc, char *argv[])
{
    if (argc < 2) {
        usage("[YCM]missing command");
    }

    if (!strcmp(argv[1], "start")) {
        if (thread_running) {
            warnx("[YCM]already running\n");
            return 0;
        }

        thread_should_exit = false;
        daemon_task = px4_task_spawn_cmd("pi_uart",
                         SCHED_DEFAULT,
                         SCHED_PRIORITY_DEFAULT,
                         2000,
                         pi_uart_thread_main,
                         (argv) ? (char * const *)&argv[2] : (char * const *)NULL);
        return 0;
    }

    if (!strcmp(argv[1], "stop")) {
        thread_should_exit = true;
        return 0;
    }

    if (!strcmp(argv[1], "status")) {
        if (thread_running) {
            warnx("[YCM]running");

        } else {
            warnx("[YCM]stopped");
        }

        return 0;
    }

    usage("unrecognized command");
    return 1;
}
int pi_uart_thread_main(int argc, char *argv[])
{
    warnx("[daemon] starting\n");
    thread_running = true;
    char data = '0';
    char buffer[4] = "";
    /*
     * TELEM1 : /dev/ttyS1
     * TELEM2 : /dev/ttyS2
     * GPS    : /dev/ttyS3
     * NSH    : /dev/ttyS5
     * SERIAL4: /dev/ttyS6
     * N/A    : /dev/ttyS4
     * IO DEBUG (RX only):/dev/ttyS0
     */
    int uart_read = uart_init("/dev/ttyS2");
    if(false == uart_read)return -1;
    if(false == set_uart_baudrate(uart_read,9600)){
        printf("[YCM]set_uart_baudrate is failed\n");
        return -1;
    }
    printf("[YCM]uart init is successful\n");



   struct mytopic_s test_data; //定义类型为mytopic_s的结构体变量rd

   orb_advert_t mytopic_pub = orb_advertise(ORB_ID(mytopic), &test_data);
    while(!thread_should_exit){
        read(uart_read,&data,1);
        if(data == 'R'){
            for(int i = 0;i <4;++i){
                read(uart_read,&data,1); //读取串口设备数据1个字节,放到data中
                buffer[i] = data;
                data = '0';}

            write(uart_read,&buffer,4);

            char * s;
            strncpy(test_data.datastr0,buffer,4);
            test_data.data = strtol(test_data.datastr0,&s,10);
            orb_publish(ORB_ID(mytopic), mytopic_pub, &test_data);


            int b=strtol(test_data.datastr0,&s,10);
            printf("\t%s\t%d\t%d\n",test_data.datastr0,test_data.data,b);
        }
    }
    warnx("[YCM]exiting");
    thread_running = false;
    close(uart_read);

    fflush(stdout);


    return 0;
}
  • 新建CMakeList.txt文件
px4_add_module(
    MODULE modules__pi_uart
    MAIN pi_uart
    STACK_MAIN 2000
    SRCS
        pi_uart.c
    DEPENDS
        platforms__common
    )
  • 在cmake/config/nuttx_px4fmu-v2_default.cmake中添加
modules/pi_uart
  • 在ROMFS/px4fmu_common/rcS中添加
pi_uart start
  • 编译
  • 烧写

树莓派3串口发送

  • 树莓派3环境配置另写博文
  • 循环发送‘R1100’小程序
#include <stdio.h> 
#include <wiringPi.h>
#include <wiringSerial.h> 
int main() 
{ 
int fd; 
char data[5]=“R1100”; 
int flag=1;
if(wiringPiSetup()<0)return 1; 
if((fd=serialOpen("/dev/ttyS0",9600))<0) return 1;
printf("serial test start ...\n");
serialPrintf(fd,"Hello world!\n"); 
while(flag) 
    { 
      serialPrintf(fd,data);//向串口设备发送data数据 
      delay(300);
        while(serialDataAvail(fd)) 
          { 
          printf("->%3d\n",serialGetchar(fd));
          flag=0; fflush(stdout); 
          } 
     } 
serialFlush(fd); 
serialClose(fd); 
return 0;
 } 

Pixhawk与树莓派3连接

TX–RX
RX–TX
GND–GND
这里写图片描述

  • TELEM1和TELEM2都是串口,从左到右分别是VC TXD RXD 未知 未知 GND

TELEM1和TELEM2都是串口,从左到右分别是VC TXD RXD  未知 未知 GND

测试结果

这里写图片描述

参考

Pixhawk—通过串口方式添加一个自定义传感器(超声波为例) —— FreeApe

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pixhawk与树莓派3的串口通信 的相关文章

  • 51单片机串口通信(UART)

    项目描述 1 串口工作方式为1 8位UART 波特率可变 无校验位 2 通信数据格式为 1位起始位 8位数据位 1位停止位 3 上电后MCU给上位机发送问候语 之后等待上位机的信息 MCU和上位机的通信为收发交替进行 MCU接收到的信息会实
  • 一款linux系统下的串口调试工具 - COMTransmit

    最近在调试linux下的串口的时候找到了一款好用且功能齐全的串口调试工具 跟大家分享一下 COMTransmit的安装 安装包下载地址 64位 链接 https pan baidu com s 1rxGhMtXYNApjhXquPtiW0w
  • CSerialPort教程4.3.x (2) - CSerialPort源码简介

    CSerialPort教程4 3 x 2 CSerialPort源码简介 前言 CSerialPort项目是一个基于C C 的轻量级开源跨平台串口类库 可以轻松实现跨平台多操作系统的串口读写 同时还支持C Java Python Node
  • 关于ESP8266自动下载和CH340的几件事

    最近在玩ESP8266 做了些东西 比如考研倒计时器 网络闹钟 网络灯 用手机控制亮度 气象站等等 ESP8266本身挺简单的 倒是这个自动下载电路 我还是第一次玩 以前玩51也用过串口下载 都是自己冷启动 玩STM32用的ST LINK
  • STM32超声波模块测距

    特别注意 单独t link只能提供3 3v电压 模块接5v电压只能收到3 3V 供电的时候请接上micro口 模块介绍 HC SR04超声波模块可提供2cm 400cm的距离感测功能 测量精度可以达到3mm 通过声音340m s t 2可以
  • 蓝桥杯单片机学习过程记录(二十八)第五届国赛串口通信相关代码补充

    蓝桥杯单片机学习过程记录 二十八 第五届国赛串口通信相关代码补充 UART串口通信 第五届国赛uart串口内容相关补充 设置数组存储输入输入字符 并与设定的密码相判断 include
  • CSerialPort教程4.3.x (7) - CSerialPort在vcpkg中的使用

    CSerialPort教程4 3 x 7 CSerialPort在vcpkg中的使用 前言 CSerialPort项目是一个基于C C 的轻量级开源跨平台串口类库 可以轻松实现跨平台多操作系统的串口读写 同时还支持C Java Python
  • CSerialPort教程4.3.x (1) - CSerialPort项目简介

    CSerialPort教程4 3 x 1 CSerialPort项目简介 前言 CSerialPort项目是一个基于C C 的轻量级开源跨平台串口类库 可以轻松实现跨平台多操作系统的串口读写 同时还支持C Java Python Node
  • 获取windows中活跃的Com口

    获取windows中活跃的Com口 记录于2021年11月9日 今天对我来说是个很特殊的一天 母胎SOLO二十一周年 无奈 Orz 闲暇之余写下此文章 记录一下我的日常 文章目录 获取windows中活跃的Com口 前言 一 如何寻找活跃C
  • LInux下串口编程详解细节

    LInux下串口设置详解 日期 2011 04 01 来源 Linux社区 作者 huang879135 字体 大 中 小 串口的设置主要是设置struct termios结构体的各个成员值 include
  • 串口拦截通信数据信息

    最近手头上有一个需要通信的外部设备 流量计 直接去看他的通信手册 里面没有例子 SO 刚开始看不太懂 官网上面有一个上位机软件 可以直接操作软件去设置参数 故 利用此上位机软件发送指令 然后在上位机和设备之间引出TX与RX 从而拦截二者串口
  • 基于STM32F103RB的模拟液位检测告警系统(已实现)

    这次先看一下老朋友STM32 有关Zigbee的内容 Z stack协议栈和基于Zigbee的环境温湿度 烟雾传感器的环境监测系统 等有时间再更 基于STM32的模拟液位检测告警系统 记得好像是某一届蓝桥杯省赛题 基于STM32告警系统介绍
  • OUT指令时,就进入了I/O端口读写周期

    1 译码电路的输入信号 每当CPU执行IN或者OUT指令时 就进入了I O端口读写周期 此时首先是端口地址有效 然后是I O读写控制信号 IOR和 IOW有效 把对端口地址译码而产生的译码信号同 IOR和 IOW结合起来一同控制对I O端口
  • 【Qt串口调试助手】1.8 - 修改Qt应用图标和窗口图标

    修改Qt应用图标和窗口图标 GitHub源码 Qt串口调试助手下载 修改应用图标 首先选择一张喜欢的图片 来作为应用图标 图片格式必须为 ico easyicon net 有很多可供下载的资源 下载好后 将其放入工程目录 之后添加到 Qt的
  • 串口通信——接收串口数据并处理(C语言)

    本文主要内容包含 1 接收串口数据程序的编程逻辑示意图 2 接收串口数据程序要用到的通用函数模块 可直接引用 无需更改 3 接收串口数据程序的示例 1 接收串口数据程序的编程逻辑示意图 2 与串口有关的函数模块及数组 可直接引用到自己的程序
  • 【Python】PyCharm中调用另一个文件的函数或类

    欢迎来到Python专栏 PyCharm中调用另一个文件的函数或类 o o 嗨 我是小夏与酒 博客主页 小夏与酒的博客 该系列文章专栏 Python学习专栏 文章作者技术和水平有限 如果文中出现错误 希望大家能指正 欢迎大家关注 目录 Py
  • STM32串口中断接收方式详细比较

    本例程通过PC机的串口调试助手将数据发送至STM32 接收数据后将所接收的数据又发送至PC机 具体下面详谈 实例一 void USART1 IRQHandler u8 GetData u8 BackData if USART GetITSt
  • 数字电路的时钟(1)-- 时钟抖动和分类

    时钟抖动通常分为时间间隔误差 Time Interval Error 简称TIE 又叫相位抖动 周期抖动 Period Jitter 和相邻周期抖动 cycle to cycle jitter 三种抖动 TIE又称为phase jitter
  • Android usb通信 实现app与arduino通信demo

    Android usb通信 一 前言 二 开始 1 AndroidManifest xml清单文件 2 创建权限广播接收者 3 枚举usb设备 4 获取usb接口以及输入 输出端点 5 打开设备 6 设置波特率 7 创建接收数据的线程 8
  • HMI智能串口屏——在STM32开发板上的实战应用及其详解

    HMI智能串口屏 在STM32开发板上的实战应用及其详解 一 HMI智能串口屏使用步骤 二 附录 一 HMI智能串口屏使用步骤 安装USART HMI软件 一般买的串口屏里面 商家送的资料里面都有改该软件 打开软件 并点击左上角的 新建 选

随机推荐

  • 04-spring-boot-resttemplate netty定制使用

    04 spring boot resttemplate netty定制使用 rest template可以使用netty定制的工厂类 Netty4ClientHttpRequestFactory xff0c 完成相关rest接口访问工作 x
  • sshuttle工具简介

    1 sshuttle简介 最近在k8s配置用到shuttle xff0c 只知道公司用它完成远端k8s集群环境网络环境打通环境工作 xff0c 于是决定研究一下它 xff0c 了解这个穷人代理究竟魅力何在 01 github链接 sshut
  • 日志无法打印问题总结

    日志无法打印问题总结 现象 log4j2运行环境可以生成日志 xff0c 但是没有任何打印信息 1 日志无法打印 最近新开发的服务 xff0c k8s容器部署后 xff0c 发现log4j2的日志无法打印 xff0c 定义的日志都生成了相关
  • 元空间过大与intern方法探究

    1 问题 所负责服务需要保存大量字符串 xff0c 通过写入大量数据 xff0c 发现元空间持续变大 xff0c 于是想到之前每位研发的的建议 xff0c 使用intern方法来优化字符串存储 xff0c 于是做了如下的测试 2 测试int
  • Spring Cloud Tencent和alibaba备忘

    1 Spring Cloud Tencent简介 服务注册与发现 Spring Cloud Tencent Polaris Discovery 命名空间服务服务实例 配置中心 Spring Cloud Tencent Polaris Con
  • Java Se 、JavaEE、JavaME区别

    1 Java Se JavaEE JavaME区别 Java SE Java SE xff08 Java Platform xff0c Standard Edition xff09 J2SE 它允许开发和部署在桌面 服务器 嵌入式环境和实时
  • STM32通用定时器实现pwm输出、输入捕获

    简介 以stm32f103rct6为例 xff0c 下面说明如何使用通用定时器实现pwm输出 详细 stm32的定时器有多种类型 xff0c 有RTC 基本定时器 通用定时器 高级定时器 下面我们选择通用定时器来实现pwm输出功能 利用比较
  • Flex Ethernet (FlexE) 初识

    Flex Ethernet FlexE 初识 1 初识FlexE Flexible Ethernet 由OIF组织制定了其统一标准 xff0c 通过OIF FLEXE 01可以了解到其基本信息 xff1b 摘录其标准的一个概要说明 xff1
  • .adoc使用说明

    开发过程中 xff0c 部分开源代码文档中出现了 adoc文件 xff0c 为了了解并使用这个文件 xff0c 简单记录以下功能和用法 xff0c 方便后续查阅使用 what xff1a AsciiDoc file 标记语言 why xff
  • 【开源推介01-flameshot】-这或许是linux最好用的截图软件

    文章目录 1 介绍flameshot2 安装flameshot3 使用flameshot3 1 命令行3 2 图形化截屏3 3 操作快捷键3 4 图形化配置 4 进阶玩转flameshot4 1 设置系统启动快捷键4 2 下拉菜单截屏 延时
  • 【开源推介02-pyang】-你离yang模型只差一个pyang工具

    文章目录 1 yang建模语言及pyang背景简介2 pyang工具特性3 pyang安装及命令行简介4 pyang的yin yang模型转化5 pyang生成tree文件6 yang语法校验7 pyang小结 你离懂yang模型只差一个p
  • 【高精度定位】关于GPS、RTK、PPK三种定位技术的探讨

    高精度定位通常是指亚米级 厘米级以及毫米级的定位 xff0c 从市场需求来看 xff0c 定位的精度越高往往越好 高精度 低成本 的定位方案无疑将是未来市场的趋势 在物联网时代 xff0c 大多数的应用或多或少都与位置服务相关联 xff0c
  • top 默认使用内存排序的命令

    linux下 xff0c top默认使用cpu来排序 xff0c 如果希望改用内存占用情况或其他项来排序 xff0c 可以通过 o选项 top o MEM 通过 man top 查看其用法 xff0c 里面描述了 o 选项 xff0c 用于
  • 寻找两个点云重叠部分

    目录 方法1 xff1a 方法1实验效果 xff1a 方法2 c 43 43 xff1a 方法2 python 方法2实验效果 xff1a 结论 xff1a 网上大部分寻找重叠区域都是对一个点云建立kdtree xff0c 然后在r半径内搜
  • 防火墙firewalld

    RHEL7中有几种防火墙共存 xff1a firewalld iptables ebtables等 基于iptables的防火墙默认不启动 xff0c 但仍然可以继续使用 RHEL7默认使用firewalld作为防火墙 xff0c 管理工具
  • 仿真平台sumo:随机生成车流的randomTrips.py的较便捷使用方法(新手用)

    Step1 xff1a 首先把需要的地图文件 xff08 net xml xff09 放入自己认为方便操作的文件夹中 此处我的地图文件为demo net 我将其放在一个桌面新建的文件夹里 xff0c 该文件夹叫sumo random 图1
  • 个人面试经验总结

    1 xff0c 海投 2 xff0c 一定要强调自己能留到该地 xff08 这个城市 这个公司 xff09 发展 3 xff0c 简历上出现的技能和项目面试前一天一定要复习 xff0c 因为面试官大部分问题会以简历为主 4 xff0c 要有
  • stm32通用定时器pwm输入模式

    简介 stm32通用定时器有多种输入模式 xff0c 其他包括了pwm输入模式 原理 pwm输入模式是在输入捕获的基础上使用两组输入捕获通道对同一个TIM引脚进行捕获 如下图所示 TIMx CH1引脚输入一个pwm信号 xff0c 经过输入
  • 集成学习中的Boosting和Bagging

    集成学习是一大类模型融合策略和方法的统称 xff0c 其中包含多种集成学习的思想 Boosting Boosting方法训练基分类器时采用串行的方式 xff0c 各个基分类器之间有依赖 它的基本思路是将基分类器层层叠加 xff0c 每一层在
  • Pixhawk与树莓派3的串口通信

    新建主题 msg文件夹下新建mytopic msg文件 char 4 datastr0 字符串的写法 存放发送过来的字符串 uint8 data 将字符串转换成整型 在msg文件夹中的cmkaelist文件中加入 新建pi uart模块 在