Pixhawk固件PX4之串口通讯

2023-11-05 01:59
文章标签 串口 通讯 px4 固件 pixhawk

本文主要是介绍Pixhawk固件PX4之串口通讯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、目的

为进一步扩展pixhawk的接口及功能,通过pixhawk现有接口(串口、I2C等)连接外部设备来实现,本节内容主要介绍串口通讯方式。

2、测试平台

硬件:pixhawk 2.4.8

px4固件版本:1.9.0

pixhawk串口采用SERIAL4: /dev/ttyS6,连接图如下:

3、功能实现

主要实现pixhawk从STM32串口端读取数据,并将数据发给PC,通过串口调试助手查看。

pixhawk端代码参考网上pixhawk串口通讯代码,具体如下:

/*** @file px4_uorb_subs.c*/#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <errno.h>
#include <drivers/drv_hrt.h>
#include <systemlib/err.h>
#include <fcntl.h>
#include <systemlib/mavlink_log.h>#include <px4_defines.h>
#include <px4_config.h>
#include <px4_posix.h>
#include <px4_shutdown.h>
#include <px4_tasks.h>
#include <px4_time.h>static bool thread_should_exit = false;		/**< px4_uorb_subs exit flag */
static bool thread_running = false;		/**< px4_uorb_subs status flag */
static int rw_uart_task;				/**< Handle of px4_uorb_subs task / thread */static int uart_init(char * uart_name);
static int set_uart_baudrate(const int fd, unsigned int baud);/*** daemon management function.*/
__EXPORT int rw_uart_main(int argc, char *argv[]);/*** Mainloop of daemon.*/
int rw_uart_thread_main(int argc, char *argv[]);/*** Print the correct usage.*/
static void usage(const char *reason);static void
usage(const char *reason)
{if (reason) {warnx("%s\n", reason);}warnx("usage: px4_uorb_adver {start|stop|status} [-p <additional params>]\n\n");
}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;/* 以新的配置填充结构体 *//* 设置某个选项,那么就使用"|="运算,* 如果关闭某个选项就使用"&="和"~"运算* */tcgetattr(fd, &uart_config); // 获取终端参数/* clear ONLCR flag (which appends a CR for every LF) */uart_config.c_oflag &= ~ONLCR;// 将NL转换成CR(回车)-NL后输出。/* 无偶校验,一个停止位 */uart_config.c_cflag &= ~(CSTOPB | PARENB);// CSTOPB 使用两个停止位,PARENB 表示偶校验/* 设置波特率 */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;}// 设置与终端相关的参数,TCSANOW 立即改变参数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);/*Linux中,万物皆文件,打开串口设备和打开普通文件一样,使用的是open()系统调用*/// 选项 O_NOCTTY 表示不能把本串口当成控制终端,否则用户的键盘输入信息将影响程序的执行if (serial_fd < 0) {err(1, "failed to open port: %s", uart_name);printf("failed to open port: %s\n", uart_name);return false;}printf("Open the %s\n",serial_fd);return serial_fd;
}/**
消息发布进程,会不断的接收自定义消息*/
int rw_uart_main(int argc, char *argv[])
{if (argc < 2) {usage("missing command");return 1;}if (!strcmp(argv[1], "start")) {if (thread_running) {warnx("px4_uorb_subs already running\n");/* this is not an error */return 0;}thread_should_exit = false;//定义一个守护进程rw_uart_task = px4_task_spawn_cmd("rw_uart",SCHED_DEFAULT,SCHED_PRIORITY_DEFAULT,//调度优先级2000,//堆栈分配大小rw_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("\trunning\n");}else {warnx("\tnot started\n");}return 0;}usage("unrecognized command");return 1;
}int rw_uart_thread_main(int argc, char *argv[])
{char data = '0';//char out_buf[5]="endl";char buffer[5] = "";	/** 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/ttyS6");if (false == uart_read)return -1;if (false == set_uart_baudrate(uart_read, 9600)) {printf("[JXF]set_uart_baudrate is failed\n");return -1;}printf("[JXF]uart init is successful\n");//warnx("[rw_uart] starting\n");thread_running = true;//write(uart_read, &out_buf[0],4);while (!thread_should_exit) {read(uart_read, &data, 1);if (data == 'R') {for (int i = 0; i < 4; ++i) {read(uart_read, &data, 1);buffer[i] = data;write(uart_read, &buffer[i], sizeof(buffer[i]));data = '0';usleep(5000);//5ms pause}printf("%s\n", buffer);}printf("rw_uart TX-test:running!\n");usleep(1000000);}//write(uart_read, &out_buf[0],4);warnx("[rw_uart] exiting.\n");thread_running = false;int fd=close(uart_read);printf("close stauts: %d\n",fd);return 0;
}

4、实验结果

QGC端的Mavlink Console端输出结果:

PC串口调试助手:

结果与期望的功能一致。

5、问题

网上搜索的pixhawk串口通讯基本上实现的是读取功能,为实现发送功能,采用write函数。

参考网上例程,串口采用TELEM2(USART3),发送数据时,存在只能在了进程启动后发送一段时间数据的问题。

后来更改为SERIAL4: /dev/ttyS6,程序正常,故初步判断TELEM2(USART3)串口发送数据可能其他进程也在调用,导致存在冲突。

 

最后附上参考的博客链接

 

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

Pixhawk原生固件PX4之串口读取信息

 

这篇关于Pixhawk固件PX4之串口通讯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/346649

相关文章

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP

ROS1 + Realsense d455 固件安装+读取rostopic数据

目录 安装固件(一定要匹配)ROS1 wrapper 安装方法Realsense SDK 安装方法Realsense Firmware 安装方法 修改roslaunch配置文件,打开双目图像和IMU数据其他坑点参考链接 安装固件(一定要匹配) 如果你是使用ROS1获取realsense数据的话,一定要注意,SDK, Firmware的版本不是越新越好!!,这是因为intel已经不

安卓开发板_联发科MTK开发评估套件串口调试

串口调试 如果正在进行lk(little kernel ) 或内核开发,USB 串口适配器( USB 转串口 TTL 适配器的简称)对于检查系统启动日志非常有用,特别是在没有图形桌面显示的情况下。 1.选购适配器 常用的许多 USB 转串口的适配器,按芯片来分,有以下几种: CH340PL2303CP2104FT232 一般来说,采用 CH340 芯片的适配器,性能比较稳定,价

STM32 HAL CAN通讯 实操

1、简介 相比于串口通讯,对于刚接触CAN通讯的小白来说,CAN通讯相对复杂,看各种视频、帖子理论,总是一知半解。本次通过傻瓜式操作,先实现CAN通讯的交互,以提高小白的信心,也便于自己复习观看。本次以STM32CubeMX进行初始化配置,通过Keil 5软件进行软件设计,通过CAN盒实现进行数据的交互。该流程实际以STM32F0、F1、F3、F4、F7实测好用(理论上都适用),这三种型号单片机

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

关于Qt在子线程中使用通讯时发生无法接收数据的情况

在多线程应用中,串口通讯或TCP通讯的场景常常涉及到持续的读写操作,如果子线程处理不当,可能会导致信号阻塞问题。本文将通过串口通讯或TCP通讯为例,详细解释如何在多线程环境中避免信号阻塞,并提供代码示例。 1. 问题背景 假设我们在一个应用程序中使用多线程处理串口或TCP通讯,通常会在子线程中实现持续的数据读取。为了确保实时处理数据,常见的做法是在子线程的 run() 方法中使用 while

java RXTXcomm 串口通信

RXTXcomm:提供了 Windows x64, x86, ia64 and Linux x86, x86_64等操作系统支持。 下载地址 http://fizzed.com/oss/rxtx-for-java 使用RXTXcomm首先要安排JRE环境,开发IED可能eclipse. 1.下载系统相应的RXTXcomm。 2.将rxtxSerial.dll、rxtxParallel.dl

Nodejs 串口通信 : websocket , serialport

最近在学习如何实现web页面和串口间通信,网页请求使用websocket,实现的基本功能如下: 1、基本需求:硬件:有两个信号灯(TLA-505-1T),一个485继电器(开关),电压转换器,工业触屏一体机。 2、原理图:                  3工作原理: 首先一体机中采用node开发服务器,网页请求采用websocket协议,直接放代码了: var express

C# WPF燃气报警器记录读取串口工具

C# WPF燃气报警器记录读取串口工具 概要串口帧数据布局文件代码文件运行效果源码下载 概要 符合国标文件《GB+15322.2-2019.pdf》串口通信协议定义;可读取燃气报警器家用版设备历史记录信息等信息; 串口帧数据 串口通信如何确定一帧数据接收完成是个麻烦事,本文采用最后一次数据接收完成后再过多少毫秒认为一帧数据接收完成,开始解析出来。每次接收到数据更新一次re