原帖地址:https://blog.csdn.net/Tansir94/article/details/81357612
一、Ubuntu下的串口助手cutecom
下載:sudo apt-get install cutecom
打開:sudo cutecom
查看電腦鏈接的串口信息(名稱):
dmesg | grep ttyS*
1
二、使用ROS提供的serial包實現串口通信
參考:
https://blog.csdn.net/u014695839/article/details/81209082
https://zm12.sm-tc.cn/?src=l4uLj4zF0NCIiIjRnJGdk5CYjNGckJLQq5CQhrOamtCP0MnOz8vHyczRl4uSkw%3D%3D&uid=712f083c01cd636faabd3f599a744351&hid=5f6a9b7ebab420e7dfe77286863c8963&pos=5&cid=9&time=1533273988450&from=click&restype=1&pagetype=0000004000000402&bu=news_natural&query=ROS%E7%B3%BB%E7%BB%9F%E4%B8%8B%E4%B8%B2%E5%8F%A3%E7%BC%96%E7%A8%8B&mode=&v=1&force=true&wap=false&uc_param_str=dnntnwvepffrgibijbprsvdsdichei
首先,下載serial軟件包:
sudo apt-get install ros-kinetic-serial #ros爲Kinect版本
1
進入下載的軟件包的位置
roscd serial
1
若是安裝成功會看到:
$:/opt/ros/kinetic/share/serial
1
新建工作空間級程序包:
cd
mkdir -p serialPort/src
cd serialPort
catkin_make
source devel/setup.bash
cd src
catkin_create_pkg serialPort std_msgs roscpp serial
cd serialPort/src
touch serialPort.cpp
在新建的serialPort.cpp中複製如下代碼:
#include <ros/ros.h>
#include <serial/serial.h> //ROS已經內置了的串口包
#include <std_msgs/String.h>
#include <std_msgs/Empty.h>
serial::Serial ser; //聲明串口對象
//回調函數
void write_callback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO_STREAM("Writing to serial port" <<msg->data);
ser.write(msg->data); //發送串口數據
}
int main (int argc, char** argv)
{
//初始化節點
ros::init(argc, argv, "serial_example_node");
//聲明節點句柄
ros::NodeHandle nh;
//訂閱主題,並配置回調函數
ros::Subscriber write_sub = nh.subscribe("write", 1000, write_callback);
//發佈主題
ros::Publisher read_pub = nh.advertise<std_msgs::String>("read", 1000);
try
{
//設置串口屬性,並打開串口
ser.setPort("/dev/ttyUSB0");
ser.setBaudrate(115200);
serial::Timeout to = serial::Timeout::simpleTimeout(1000);
ser.setTimeout(to);
ser.open();
}
catch (serial::IOException& e)
{
ROS_ERROR_STREAM("Unable to open port ");
return -1;
}
//檢測串口是否已經打開,並給出提示信息
if(ser.isOpen())
{
ROS_INFO_STREAM("Serial Port initialized");
}
else
{
return -1;
}
//指定循環的頻率
ros::Rate loop_rate(50);
while(ros::ok())
{
if(ser.available()){
ROS_INFO_STREAM("Reading from serial port\n");
std_msgs::String result;
result.data = ser.read(ser.available());
ROS_INFO_STREAM("Read: " << result.data);
read_pub.publish(result);
}
//處理ROS的信息,比如訂閱消息,並調用回調函數
ros::spinOnce();
loop_rate.sleep();
}
}
連接串口設備,通過第一部分給出的查看電腦連接串口號,更改上述程序中的ser.setPort("/dev/ttyUSB0");
更改CMakeList.txt文件,添加如下兩行:
add_executable(${PROJECT_NAME}_node src/serialPort.cpp)
add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
)
運行roscore,運行節點看是否能打開串口。如果提示Unable to open port,是由於權限不夠引起的,進行如下操作
創建文件:(若使用的是ttyACM將ttyusb替換即可)
1.永久解決串口權限問題
sudo gedit /etc/udev/rules.d/70-ttyusb.rules
1
2
在打開的文件中添加
KERNEL=="ttyUSB[0-9]*", MODE="0666"
或者
KERNEL=="ttyUSB*", OWNER="root", GROUP="root", MODE="0666"
1
保存即可,重啓或註銷用戶在登錄後生效
2.臨時獲取串口權限
先查看插入電腦的串口號
ls /dev/ | grep ttyUSB
1
知道串口號之後對指定串口賦予權限,以ttyUSB0爲例
sudo chmod a+rw /dev/ttyUSB0
1
不用重啓即可生效