1、查看本机当前USB、串口设备
- 查看当前已连接的 USB 设备:
lsusb
; - 查看电脑连接的USB 转串口的信息:
dmesg | grep ttyUSB*
; - 查看电脑连接的串口的信息:
dmesg | grep ttyS*
; - 查看串口名称使用:一般USB转串口设备/dev/ttyUSB*,如果是普通的串口设备会是/dev/ttyS*
ls -l /dev/tty*
;
ls -l /dev/ttyS*
;
ls -l /dev/ttyUSB*
;
2、安装 Linux 下的串口调试助手
2.1 CuteCom
// 安装
sudo apt-get install cutecom
// 运行
sudo cutecom
![在这里插入图片描述](https://img-blog.csdnimg.cn/5fd660cc59574cb38b6eefc54b9a0311.png)
CuteCom 使用可参考:Linux下uart通讯——cutetom的使用
2.2 CommMaster
CommMaster 是一款跨平台调试工具,支持 deepin, windows xp, macos。Gitee 仓库地址:https://gitee.com/itas109/CommMaster/
![在这里插入图片描述](https://img-blog.csdnimg.cn/7faa94e6ebf148d1a0474f3e0544f609.png)
3、使用 ROS 提供的 serial包实现串口通信
serial作为ROS与下位机通讯的功能包,可以很方便的供我们与我们的下位机通信。
3.1 安装 ros-melodic-serial 包
// 安装
sudo apt install ros-melodic-serial
进入下载的软件包的位置 roscd serial
,若是安装成功会看到:
![在这里插入图片描述](https://img-blog.csdnimg.cn/ae044349ea2d4fa6b6081d8ba4ef752c.png)
3.2 创建工作空间和功能包
// 创建工作空间
$ mkdir -p ~/serial_port_ws/src
$ cd ~/serial_port_ws/src/
$ catkin_init_workspace
// 编译工作空间
$ cd ~/serial_port_ws/
$ catkin_make
// 设置环境变量
$ source devel/setup.bash
// 检查环境变量
$ echo $ROS_PACKAGE_PATH
// 创建功能包
$ cd ~/serial_port_ws/src/
$ catkin_create_pkg serial_communicate std_msgs rospy roscpp serial
// 编译功能包
$ cd ~/serial_port_ws/
$ catkin_make
$ source ~/serial_port_ws/devel/setup.bash
笔者在创建功能包时直接包含了serial,所以CMakelists.txt和package.xml文件无需再次添加编译规则:$ catkin_create_pkg serial_communicate std_msgs rospy roscpp serial
3.3 编写串口发送和接收节点
创建名为 key_input_send.cpp
节点文件:
#include<ros/ros.h>
#include<serial/serial.h>
#include<std_msgs/String.h>
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int serial_write(serial::Serial &ser, std::string &serial_msg)
{
ser.write(serial_msg);
return 0;
}
int serial_read(serial::Serial &ser, std::string &result)
{
result = ser.read( ser.available() );
return 0;
}
int main(int argc, char** argv)
{
ros::init(argc, argv,"my_serial_port");
ros::NodeHandle n;
serial::Serial ser;
ser.setPort("/dev/ttyUSB0");
ser.setBaudrate(9600);
serial::Timeout to = serial::Timeout::simpleTimeout(1000);
ser.setTimeout(to);
try
{
ser.open();
}
catch(const std::exception& e)
{
ROS_ERROR_STREAM("Unable to open port ");
return -1;
}
if( ser.isOpen() )
{
ROS_INFO_STREAM("Serial Port initialized. \n");
}
else
{
return -1;
}
ros::Rate loop_rate(50);
std::string data, result;
int func(0);
cout << "Please input function number:" << endl;
while( ros::ok() )
{
cout << "Your function number is: ";
cin >> func;
switch (func)
{
case 0: data = "A 800 456\r\n"; break;
case 1: data = "B 1200 456\r\n"; break;
case 2: data = "C 1600 456\r\n"; break;
case 3: data = "D 1800 456\r\n"; break;
default: ROS_ERROR_STREAM("No this function number!!!"); break;
}
serial_write(ser, data);
cout << " the data write to serial is : " << data.c_str();
serial_read(ser, result);
cout << " the data read from serial is : " << result.c_str();
cout << endl;
}
ser.close();
return 0;
}
配置 CMakeLists.txt
文件:
add_executable(key_input_send src/key_input_send.cpp)
target_link_libraries(key_input_send ${catkin_LIBRARIES})
以上代码参考自CSDN博客:ROS使用serial包进行串口通信
3.4 测试节点
使用刘老师自研的两个 USB 转串口无线收发模块
,进行无线串口收发通信测试。其中 ttyUSB0
采用上述节点控制,ttyUSB1
采用 CommMaster
串口调试助手测试。
![在这里插入图片描述](https://img-blog.csdnimg.cn/4215ced987484fd3b4878ca646ef8e63.jpeg#pic_center)
// 开启一个终端
$ roscore
// 再开启一个终端
$ rosrun serial_communicate key_input_send
![在这里插入图片描述](https://img-blog.csdnimg.cn/b8fadb3013914d79afc9078fa2a14df0.png)
打开 CommMaster
,连接串口 /dev/ttyUSB1
![在这里插入图片描述](https://img-blog.csdnimg.cn/34fcc29883be40d89d6f8761bfbe8838.png)
在终端中依次输入 0 1 2 3,观察到 CommMaster
中接收区显示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/4d188c0f20c94625b624dcb61ff6660b.png)
可见,ttyUSB0
向 ttyUSB1
发送数据正常。
在 CommMaster
发送区发送一次 HuangXiaoBaiDeJinJieZhiLu
,然后在终端随意输入0 1 2 3 中的任意一个数字,显示如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/da5d3bd7dcbd4f21a922b70a863808e5.png)
可见,ttyUSB1
向 ttyUSB0
发送数据正常,且 ttyUSB0
读取数据正常。测试完毕。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)