1. USB转串口设备连接到Ubuntu虚拟机
1.1 查看windows 是否能识别USB转串口
将 USB转串口设备 插入电脑的USB接口,在搜索中输入“设备管理器”,打开【设备管理器】
windows识别到USB转串口:
1.2 USB转串口设备与Ubuntu虚拟机连接
点击VM的【虚拟机】菜单 →【可移动设备】 →【Future Devices USB Serial Converter】→【 连接(断开与主机的连接)】
【Future Devices USB Serial Converter】菜单项前面被打√,代表识别到串口。
1.3 查看USB转串口在Ubuntu虚拟机中的设备名称
拔出USB转串口设备,在终端中输入指令
$ ls /dev/tty*
重新插入USB转串口设备,再执行指令ls /dev/tty*,可以看到新增一项“/dev/ttyUSB0” ,ttyUSB0就是对应的串口设备名称。
为串口设备文件增加可读写权限,否则不能对串口设备执行读写操作
方式1 :临时设置串口设备文件的权限(每次开机都需重新设置)
$ sudo chmod 666 /dev/ttyUSB0
方式2:创建ttyUSB权限规则文件(一劳永逸)
$ sudo gedit /etc/udev/rules.d/70-ttyusb.rules
文件中写入下列代码:
KERNEL=="ttyUSB*", OWNER="root", GROUP="root", MODE="0666"
保存,重新登录后即生效
2. ROS安装serial包
安装指令:
sudo apt-get install ros-melodic-serial
不同版本的ROS,有对应的ROS包,melodic版本的ROS,serial包名称为
“ ros-melodic-serial ”
3. ROS实现串口通信
(1)创建串口对象
(2)设置串口属性,打开串口
(3)串口数据收发
3.1 编写串口通信程序
3.1.1 创建工作空间,编译,将工作空间添加到环境变量**
$ mkdir -p test_serial_ws/src
$ cd test_serial_ws
$ catkin_make
....
$ source devel/setup.bash
3.1.2 创建软件包,添加依赖 serial包,编辑程序文件**
$ cd src
$ catkin_create_pkg serial_demo roscpp serial
src文件下,创建serial_demo.cpp的c++程序
$ serial_demo
$ cd src
& touch serial_demo.cpp
编辑serial_demo.cpp文件
#include <ros/ros.h>
#include <serial/serial.h>
#include <iostream>
int main(int argc,char**argv)
{
setlocale(LC_ALL,"");
//ros显示中文
ros::init(argc,argv,"serial_port");
//创建节点,节点名唯一
ros::NodeHandle nh;
//创建句柄 ,向ros master注册节点信息
serial::Serial sp;
//创建窗口对象
try
{
sp.setPort("/dev/ttyUSB0");
//设置要打开串口名称
sp.setBaudrate(9600);
//设置波特率
serial::bytesize_t bytesize = serial::eightbits;
sp.setBytesize(bytesize);
//设置数据位
serial::parity_t parity = serial::parity_none;
sp.setParity(parity);
//设置奇偶检验
serial::stopbits_t stopbits = serial::stopbits_one;
sp.setStopbits(stopbits) ;
//设置停止位
serial::Timeout to = serial::Timeout::simpleTimeout(100);
sp.setTimeout(to);
//设置接收字节间隔的超时时间
sp.open();
//打开串口
}
catch(serial::IOException &e)
{
ROS_ERROR_STREAM("打开串口失败");//串口设备的权限不够
}
if(sp.isOpen())
{
sp.flushInput();
//清空输入的缓存区
ROS_INFO_STREAM("串口打开成功");
}
else
{
return -1;
}
ros::Rate loop_rate(500);
while(ros::ok())
{
size_t n = sp.available();
//缓冲区中数据的字节数,函数返回值作为接收字符的长度
if(n!=0)
{
std::string rev;
rev = sp.read(n);//n为字节数
//读取缓冲区数据
std::cout<<rev<<std::endl;
sp.write(rev.c_str());;
//发送读取到的数据
}
loop_rate.sleep();
}
sp.close();
return 0;
}
修改CMakeList文件
add_executable(serial_demo src/serial_demo.cpp)
add_dependencies(serial_demo ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(serial_demo ${catkin_LIBRARIES})
编译
$ cd test_serial_ws
$ catkin_make
.....
3.2 运行
首先插入另外一个USB转串口设备,在windows下使用串口调试助手打开该串口设备,同时将两个USB串口设备进行物理连接。
在Ubuntu虚拟机打开终端,运行roscore
$ roscore
打开另外一个终端,运行serial_port节点
$ rosrun serial_demo serial_demo