像雷达 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动态数组里面,通过解析数组里面的数据造就了不同的硬件功能,比如陀螺仪输出的是角速度, 雷达输出的是距离信息。