怎样愉快的使用串口发送16进制数据并读取串口内容

news2024/11/26 0:39:31

像雷达 imu 陀螺仪一类的传感器,一般都是用的usb转串口和主机连接,然后通过串口读取传感器数据,串口是我们绕不过的一道坎,那我们就来继续手撕串口。

串口连接主机问题看上篇:

怎样愉快的连接使用usb转串口设备_JT_BOT的博客-CSDN博客
现在我们假装已经连接好了串口,并且串口的端口名: /dev/ttyUSB0

安装serial库参考:

ROS2 Humble如何使用串口驱动?(Serial)_ros2 串口_腾腾任天真的博客-CSDN博客

串口测试程序,硬件用JY_95T IMU加速度计 陀螺仪,这款imu在工作前需要发送一段代码命令设置imu的工作方式 {0xA4,0x03,0x08,0x23,0xD2}

创建文件目录
mkdir serial_test_cpp
cd serial_test_cpp
mkdir build
touch serial_test.cpp
touch CMakeLists.txt
目录结构

 

 

serial_test.cpp
//serial_test.cpp
#include <serial/serial.h>   //导入串口库,这个串口库需要安装

int main(void)
{
    std::string port_name="/dev/ttyUSB0";  //根据自己的硬件端口号调整
    int baud_rate_=115200;  //这里可以查看使用手册
    serial::Serial ser;     //创建串口对象

     /**打开设备**/
    try
    {
        ser.setPort(port_name);
        ser.setBaudrate(baud_rate_);
        serial::Timeout to = serial::Timeout::simpleTimeout(100);
        ser.setTimeout(to);
        ser.open();
    }
    catch (serial::IOException &e)
    {
        printf("串口打开失败!\n");
    }

    if (ser.isOpen())
    {
       printf("串口已经打开\n");
    }
 //----------------------------发送数据----------------------------------
    //unsigned char cmd_buffer[5] ={'a','b','c','d','e'};  //发送字符 c风格字符需加单引号
    unsigned char cmd_buffer[5] ={0xA4,0x03,0x08,0x23,0xD2};  //发送16进制数  0x开头是16进制数字写法 
    //unsigned char cmd_buffer[5] ={2,15,55,120,255};  //发送10进制数,无符号char取值范围0-255
    //unsigned char cmd_buffer[5] ={'a','b',0x03,120,255};  //混合发送字符 16进制数 10进制数
    /*
    上面的不同组合可以分别打开屏蔽发送试试,串口应该是只能发送unsigned char类型,取值范围0-255,字符,16进制,
    10进制在ASCII码里面是同一种东西
    */
    ser.write(cmd_buffer,5); //向串口发送数据
    //%x是16进制占位符
    printf("发出命令: %x %x %x %x %x\n",cmd_buffer[0],cmd_buffer[1],cmd_buffer[2],cmd_buffer[3],cmd_buffer[4]);
 //----------------------------接收数据----------------------------------

    int count = ser.available(); // count读取到缓存区数据的字节数,不等于0说明缓存里面有数据可以读取
    while (count != 0)  //无限循环接收数据
    {
        printf("从串口接收数据\n");    
        //int num;
          
        std::vector<unsigned char> read_buf(count);//开辟数据缓冲区,串口read读出的内容是无符号char类型
        ser.read(&read_buf[0], count); // 读出缓存区缓存的数据,返回值为读到的数据字节数

        for(int i = 0;i < count;i++)
        {
            printf("%x ",read_buf[i]); //%x 以16进制的方式打印收到的每一位数据
        } 
        printf("\n");
    }
          

    return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(serial_test)

#Default to C++14
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 14)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

find_package(serial REQUIRED)

add_executable(${PROJECT_NAME} serial_test.cpp)  
target_link_libraries(${PROJECT_NAME} serial)

编译

cd ~/serial_test_cpp/build
cmake .. 
make

./serial_test  //运行测试程序

测试结果

 至此通过串口已经成功发送数据,并且在循环接收串口发送来的数据了。不同的串口传感器在发送和接收数据层面功能是相同的,收到的数据存在了read_buf动态数组里面,通过解析数组里面的数据造就了不同的硬件功能,比如陀螺仪输出的是角速度, 雷达输出的是距离信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/718812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WalxPlugin免Root框架使用详解和示例代码

2023年7月4日首发 WalxPlugin框架&#xff08;以下简称WP框架&#xff09;是一个不需要root权限就能使用的插件化模块&#xff0c;能够轻松实现在非root设备hook其它应用的调用和访问进程数据等功能。目前该框架已发布测试版。 一.WP框架工具包提供了以下几个模块&#xff1a…

5.8.5 TCP可靠传输(一)序号确认机制

5.8.5 TCP可靠传输&#xff08;一&#xff09;序号确认机制 TCP是可靠的传输层协议&#xff0c;主要通过序号确认机制、超时重传机制、定时器三个方面实现可靠传输。 一、序号确认机制 TCP将所要传送的整个的应用层报文看成是一个一个字节组成的数据流&#xff0c;并对每一个…

Cyclo(-Ala-Tyr),21754-26-7,环(丙氨酸-酪氨酸)二肽,由两个氨基酸通过肽键环合形成

&#xff08;文章资料汇总&#xff1a;陕西新研博美生物科技有限公司小编MISSwu&#xff09;​ 【产品描述】 Cyclo(-Ala-Tyr)&#xff0c;环(丙氨酸-酪氨酸)二肽&#xff0c;环二肽由两个氨基酸通过肽键环合形成&#xff0c;在氢键相互作用驱动下具有较强的自组装倾向&#x…

python的作用域、globals()-全局变量 和 locals()-局部变量

目录 查看全局变量和局部变量 变量解析规则 变量生存周期 在python中&#xff0c;函数会创建一个自己的作用域&#xff0c;也称为为命名空间。当我们在函数内部访问某个变量时&#xff0c;函数会优先在自己的命名空间中寻找。 我们自己定义的全局变量均在python内建的globa…

java项目linux启动文件

更改jar包名称和jar包所在目录 JAR包名称 替换成自己的项目包名称 JAR包所在目录替换成自己的jar包所在的目录 这里面的字符建议手打到服务器文件内&#xff0c;复制粘贴的话可能存在特殊符号 ps -ef|grep java SERVICE_PID$(ps aux | grep JAR包名称 | grep -v grep | awk…

influxDB聚合类函数

influxDB聚合类函数 1&#xff09;count()函数 返回一个&#xff08;field&#xff09;字段中的非空值的数量。 SELECT COUNT(<field_key>) FROM <measurement_name> [WHERE <stuff>] [GROUP BY <stuff>] 例子1 计算非空water_level数量SELECT COUN…

Web3 处理智能合约部署到本地区块链,并在本地进行测试

上文 Web3 在Truffle项目中编写出自己的第一个solidity智能合约我们演示了 在Truffle环境下写一个智能合约并编译的功能 编译出的文件夹中的这个JSON就非常重要了 我们就可以通过 它这个ABI链接到需要的智能合约程序上去 但这也仅仅是编译完了 我们的智能合约还没有部署到我们…

gma 2 教程(一)概述:2.GMA 安装

依赖环境 系统环境 【操作系统】&#xff1a;64位&#xff08;amd64&#xff09;Windows、Linux 【内存】&#xff1a;≥8 GBPython 环境 【Windows】&#xff1a;3.8.8~3.11 【Linux】&#xff1a;3.9~3.11 目前不支持MacOS和其他平台。建议安装Anaconda创建Python环境。Anac…

解决postman接口自动化测试中登录后401权限问题

大家在做接口自动化测试的时候&#xff0c;碰到有登录的系统应该都会遇到401权限的问题&#xff0c;下面我来说下如何解决这个问题。 首先需要了解问题的本质&#xff0c;是要解决什么&#xff1f;这样我们才好对症下药&#xff0c;报401是因为用户在登录的时候&#xff0c;服务…

亚马逊云科技让AI开发速度更快,门槛更低

过去只有大型科技公司、政府机构和大学才有能力和时间、金钱去部署生成式AI能力。近二十年来&#xff0c;云服务把计算的门槛降低了。亚马逊云科技全球产品副总裁Matt Wood博士表示&#xff1a;“我们希望在生成式AI上做同样的事&#xff0c;把技术提供到每个开发者和商业用户的…

kaggle免费服务器全攻略

1. kaggle服务器16G显卡一周40小时. 所以我们直接干一堆谷歌账号即可 2. 谷歌账号的注册: 我们需要FQcolab for windows可以做到. 然后我们注册好账号后.我们注册4个账号. 注册方法. 打开chrome 点最下面的添加按钮.然后一直下一步即可.无脑注册. 3. 为Chrome多账户添加单独的…

机器人制作开源方案 | 立式铣床模型

1. 功能说明 铣床主要是指用铣刀在工件上加工多种表面的机床&#xff0c;本文示例将通过程序控制模拟铣床的运动效果--模拟铣床进行加工时各个结构的运动方式。铣床的运动主要包括&#xff1a;主轴的旋转运动、立铣头的上下进给运动、工作台的前后左右进给运动。 2. 结构说明 该…

期权专业知识常用术语有哪些?虚值期权和实值期权怎么选择合理的执行价

【1】美式期权&#xff1a;每个交易日都可以行权的期权 【2】欧式期权&#xff1a;只有在到期日才可以执行的期权 【3】平值期权&#xff1a;内在价值为零或极小的期权&#xff0c;或行权价格等于或接近于标的物合约市场价格的期权。通常是指行权价格最接近标的合约市场价格的期…

JavaEE语法之第二章、多线程(初阶三)

目录 一、多线程带来的风险-线程安全 (重点) 1.1观察线程不安全 1.2线程安全的概念 1.3线程不安全的原因 1.3.1抢占式执行&#xff08;进程的随机调度&#xff09; 1.3.2多个线程修改同一个变量 1.3.3内存的可见性 1.3.4原子性 1.3.5指令重排序 二、解决之前的线程不…

Spring Boot 中的 @Query 注解是什么,原理,如何使用

Spring Boot 中的 Query 注解是什么&#xff0c;原理&#xff0c;如何使用 在 Spring Boot 中&#xff0c;Query 注解是一个非常常用的注解&#xff0c;用于定义自定义查询语句。本文将介绍 Query 注解的作用、原理和使用方法。 1. Query 注解的作用 在 Spring Boot 中&#…

【论文精读】《Classifying User Activities in the Encrypted WeChat Traffic》

Classifying User Activities in the Encrypted WeChat Traffic Authors:Chengshang Hou,Junzheng Shi,Cuicui Kang,Zigang Cao,Xiong Gang Journal:2018 IEEE 37th International Performance Computing and Communications Conference (IPCCC) (2018) 摘要 加密移动应用程序…

【算法】从记忆化搜索到递推——动态规划入门

文章目录 笔者说&#xff1a;我们为什么要学记忆化搜索&#xff1f;预备知识例题&#xff1a;198. 打家劫舍记忆化搜索 相关题目练习70. 爬楼梯记忆化搜索dp 746. 使用最小花费爬楼梯记忆化搜索dp 2466. 统计构造好字符串的方案数记忆化搜索dp 213. 打家劫舍 II记忆化搜索dp 笔…

unity + python socket通信,自定义数据包

unity和python相互之间通过socket通信来发送自定义数据包是一个利用unity构建场景和通过python来做数据处理的方式&#xff0c;能够有效的利用两种不同语言的优势。 我已经将对应的操作封装为对应的一个模块&#xff0c;SocketTools.cs&#xff0c;我们先来看一下具体的代码用…

7.3.2 【Linux】磁盘分区: gdisk/fdisk

MBR 分区表使用 fdisk 分区&#xff0c; GPT 分区表使用 gdisk 分区。 gdisk 通过lsblk或blkid先找到磁盘&#xff0c;再用parted /dev/xxx print来找出内部的分区表类型&#xff0c;之后采用gdisk或fdisk来操作系统。上表中可以发现 gdisk 会扫描 MBR 与 GPT 分区表&#xff…

【Arduino】超声波实验

4个端&#xff1a; Vcc &#xff1a; 5V电源Trig &#xff1a; 控制端&#xff08;触发&#xff09;Echo &#xff1a; 接收端&#xff08;回声&#xff09;Gnd &#xff1a; 接地端 相关参数 &#xff1a; 工作电流 &#xff1a; 15mA工作电压 &#xff1a; 5V工作频率 &am…