ROS学习记录——串口通信
#include <ros/ros.h>
#include <std_msgs/Empty.h>
#include <std_msgs/String.h>
#include <serial/serial.h>
serial::Serial ser; //声明串口对象
/*
* read()函数 :
* 1. size_t read (uint8_t *buffer, size_t size); 从缓冲区读size位保存在buffer中 返回实际读取的位数
* 2. size_t read (std::vector<uint8_t> &buffer, size_t size = 1);
* 3. size_t read (std::string &buffer, size_t size = 1);
* 4. std::string read (size_t size = 1); 读制定位数,返回指定位数的数据
*
* write()函数 :1. size_t write (const uint8_t *data, size_t size);
* 2. size_t write (const std::string &data);
* 3. size_t write (const std::vector<uint8_t> &data);
*
* void setPort (const std::string &port); 设置端口 普遍为"/dev/ttyUSB0"
* void setBaudrate (uint32_t baudrate); 设置波特率
* size_t available (); 返回缓冲区存在字符的大小
* void setTimeout (Timeout &timeout); 设置超时
* void open (); 开启串口
* void close (); 关闭串口
* bool isOpen (); 是否关闭了串口
*/
//write话题消息的回调
//当收到write话题消息时将其发送到串口
void receiveCallback(const std_msgs::String::ConstPtr& msg)
{
}
int main(int argc,char** argv)
{
//初始化ros
ros::init(argc, argv, "with_serial");
ros::NodeHandle node;
//订阅write,等待发送数据的命令
ros::Subscriber sub = node.subscribe("write",1000,receiveCallback);
//发布read话题,讲串口读的消息发入read中
ros::Publisher pub = node.advertise<std_msgs::String>("read",1000);
ros::Rate loop_rate(50);
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;
}
while(ros::ok())
{
if(ser.available())
{
std_msgs::String result;
result.data = ser.read(ser.available());
//打印读取到的串口消息
ROS_INFO_STREAM("Read: " << result.data);
//讲读取的消息发布
pub.publish(result);
}
//处理ROS的信息,比如订阅消息,并调用回调函数
ros::spinOnce();
loop_rate.sleep();
}
}