ros串口通讯(读取串口数据)

ros串口通讯是非常重要的通讯手段,通常跟下位机或者各种usb口外设都是通过串口进行通讯的。

那么我们跟着教程来学习一下如何读取手机通过无线串口发送给电脑的数据。

这里我通过一个usb-ttl工具将蓝牙连接到电脑上,然后通过手机连接蓝牙给蓝牙发送数据,然后电脑从usb-ttl工具读取数据并显示。

1.首先,ros里面有相应的串口包给我们用。我们调用串口包编程会非常方便。下载串口库:

sudo apt-get install ros-melodic-serial

我的ros版本是melodic,如果跟我版本不一样,讲melodic替换成相应的版本代号。

2.创建一个ros功能包并且添加相应的依赖。主要依赖roscpp和serial包

catkin_create_pkg serial_demo roscpp serial

3.在serial_demo功能包的src文件夹里面,我们创建一个serial_demo.cpp的c++程序。

然后将以下代码复制进入(记得更改下方程序中波特率跟蓝牙波特率一致,同时更改到正确的串口):

//serial_demo.cpp
#include <ros/ros.h>
#include <serial/serial.h>
#include <iostream>
 
int main(int argc, char** argv)
{
    ros::init(argc, argv, "serial_port");
    //创建句柄(虽然后面没用到这个句柄,但如果不创建,运行时进程会出错)
    ros::NodeHandle n;
    
    //创建一个serial对象
    serial::Serial sp;
    //创建timeout
    serial::Timeout to = serial::Timeout::simpleTimeout(100);
    //设置要打开的串口名称
    sp.setPort("/dev/ttyUSB0");
    //设置串口通信的波特率
    sp.setBaudrate(9600);
    //串口设置timeout
    sp.setTimeout(to);
 
    try
    {
        //打开串口
        sp.open();
    }
    catch(serial::IOException& e)
    {
        ROS_ERROR_STREAM("Unable to open port.");
        return -1;
    }
    
    //判断串口是否打开成功
    if(sp.isOpen())
    {
        ROS_INFO_STREAM("/dev/ttyUSB0 is opened.");
    }
    else
    {
        return -1;
    }
    
    ros::Rate loop_rate(500);
    while(ros::ok())
    {
        //获取缓冲区内的字节数
        size_t n = sp.available();
        if(n!=0)
        {
            uint8_t buffer[1024];
            //读出数据
            n = sp.read(buffer, n);
            
            for(int i=0; i<n; i++)
            {
                //16进制的方式打印到屏幕
                std::cout << std::hex << (buffer[i] & 0xff) << " ";
            }
            std::cout << std::endl;
            //把数据发送回去
            sp.write(buffer, n);
        }
        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}
)

4.然后编译执行即可:

但是他这边显示的是16禁止格式的数据。

如果我想显示字符或者字符串的话怎么修改呢?

找到程序第58行,将其注释掉,然后在第59行添加一句输出字符的代码就行:

std::cout<<buffer[i];

可以看出来,已经正确输出了从手机端发送过来的字符:

参考链接:https://blog.csdn.net/u014695839/article/details/81209082

ROS与Arduino之间进行串口通信可以使用以下步骤: 1.在Arduino上安装ROS串口通信库,例如rosserial库。 2.编写Arduino代码,将其上传到Arduino板上,该代码应该包含ros.h头文件和串口初始化函数。 3.在ROS上创建一个节点,使用rosserial库与Arduino进行通信。 4.在ROS节点中使用发布者和订阅者来发送和接收数据。 下面是一个简单的例子,演示如何在ROS中使用rosserial库与Arduino进行通信: 1.安装rosserial库 在Arduino IDE中,选择"Sketch -> Include Library -> Manage Libraries",然后搜索"rosserial"并安装。 2.编写Arduino代码 以下是一个简单的示例代码,该代码将读取来自ROS的整数,并将其写入到串口: ``` #include <ros.h> #include <std_msgs/Int32.h> ros::NodeHandle nh; void messageReceived(const std_msgs::Int32& msg) { int value = msg.data; Serial.println(value); } ros::Subscriber<std_msgs::Int32> sub("topic_name", messageReceived); void setup() { nh.initNode(); nh.subscribe(sub); Serial.begin(9600); } void loop() { nh.spinOnce(); } ``` 3.创建ROS节点 在终端中,输入以下命令来创建ROS节点: ``` rosrun rosserial_python serial_node.py /dev/ttyUSB0 ``` 其中,/dev/ttyUSB0应该是Arduino连接到计算机上的串口设备名称。 4.使用ROS发布者和订阅者 在ROS节点中,使用以下代码来发布数据: ``` ros::NodeHandle nh; ros::Publisher pub = nh.advertise<std_msgs::Int32>("topic_name", 10); std_msgs::Int32 msg; msg.data = 42; pub.publish(msg); ``` 使用以下代码来订阅数据: ``` ros::NodeHandle nh; ros::Subscriber<std_msgs::Int32> sub = nh.subscribe("topic_name", 10, messageReceived); void messageReceived(const std_msgs::Int32& msg) { int value = msg.data; ROS_INFO("Received value: %d", value); } ``` 注意:在使用rosserial库进行通信时,需要确保Arduino板上的程序正常运行,并且串口设备名称正确。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen953

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值