ROS学习记录——串口通信

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(); 
    }
} 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值