android 读写串口中文字符串_vscode开发ROS1(19)-ros与arduino串口通信(c++)

本文介绍了如何在ROS环境下实现与Arduino的串口通信,适用于各种芯片如STM32、51单片机。首先安装ROS提供的serial库,然后编写Arduino端的简单串口程序,接收并回传数据。在ROS端创建节点,配置端口号,并通过CMakeLists.txt文件链接serial库。完成编译后,启动ROS节点实现通信。如果遇到“无法打开串口”的问题,需检查串口权限和占用情况。
摘要由CSDN通过智能技术生成

40857572daa52c1ab1b14eaeea272fca.png

写在最前

串口通信在嵌入式领域的重要性我也就不多说了, 这里的ros与arduino串口通信的方案, 同样适合于stm32, 51单片机等各种芯片. 这里与rosserial有区别, rosserial是基于某种类型的板子开发的.

安装serial库

首先当然是需要安装serial库啦, ros官方是提供了一个编译好的包给大家使用, 就不用大家去编译了. 直接输入下面的指令, 安装即可.

sudo apt-get install ros-kinetic-serial #此处的kinetic请根据安装的ros版本进行替换

编写arduino串口通信程序

arduino的串口通信程序很简单, 当arduino接受到数据之后, 原封不动的将数据进行返回, 也就不多解释了, 看注释就行:

#include <Arduino.h>
String readStr = "";
void setup()
{
  Serial.begin(9600); //打开串口, 波特率9600
}

void loop()
{
  while (Serial.available())  //等待串口接受到数据
  {
    readStr = readStr + char(Serial.read()); //将所有接受到的数据转成字符串
    delay(2); //等待串口读取完成
  }

  if(readStr.length()>0) //如果读到了数据
  {
    Serial.print(readStr); //将数据原封不懂返回
    readStr = "";  //清空
  }

  delay(20); //延时一段时间
}

博主这里使用的还是platformio, 使用arduino IDE也行.

编写ros节点

在ros_test文件夹下新建serial_test.cpp文件. 说明一下: 如果你是第一次看我的博客, 可能不知道ros_test文件夹是什么, 这个是在ros工程下的自己创建的功能包, 具体请查看以往的文章.

#include <serial/serial.h>
#include <ros/ros.h>
#include <string>


int main(int argc, char **argv)
{
    ros::init(argc, argv, "serial_test"); //创建节点
    ros::NodeHandle nh;
	serial::Serial ser;
    setlocale(LC_ALL, ""); //中文支持
	try 
    { 
        ser.setPort("/dev/ttyUSB0");  //设置端口号
        ser.setBaudrate(9600);  //设置波特率
        serial::Timeout tout = serial::Timeout::simpleTimeout(1000);//设置延时等待 ms
        ser.setTimeout(tout); 
        ser.open(); //打开串口
    } 
    catch (serial::IOException& e) 
    { 
        ROS_ERROR_STREAM("无法打开串口 "); 
        return -1; 
    } 
    
    if(ser.isOpen())  //成功打开串口
    { 
        ROS_INFO_STREAM("串口初始化成功"); 
    } 
    else 
    { 
        return -1; 
    } 
    
    while(ros::ok()) 
    {
	    std::string result; //接受字符串
	    
        std::string msg = "hello"; //发送数据
		
        ser.write(msg); //像单片机发送数据
        sleep(1);       //等待1s
        while(ser.available()>0) //当串口接受到数据时
        {
            result = ser.read(ser.available());//读取所有数据
            std::cout<<result<<std::endl; //打印
        }
    }
	return 0;
}

端口号配置

注意, 这个ros程序中, 设置的端口号, 根据你的arduino所在的端口进行配置, 查看方法:
1, 插入arduino.
2, 打开platformio的主页, 方法在上一篇文章有说.

7d662e1ba36765207e8b4c55775ea823.png

3, 点击devices, 即可查看arduino所在的端口.

9ad58a9939d29589503788bb348e2347.png

配置CMakeLists.txt文件

1, 修改find_package, 新增serial包

find_package(catkin REQUIRED COMPONENTS ... serial )

2, 在文件的末尾, 加上:

add_executable(serial_test src/serial_test.cpp) target_link_libraries(serial_test ${catkin_LIBRARIES}) add_dependencies(serial_test ${PROJECT_NAME}_generate_messages_cpp)

编译整个ROS工程

点击"终端"–>“新建终端”,在终端中输入"catkin_make".

运行节点

1, 使用快捷键Ctrl + Shift + T 弹出系统终端,输入roscore,启用整个ROS总节点。
2, 使用快捷键Ctrl + Shift + T 弹出系统终端,输入rosrun ros_test serial_test,启用serial_test节点。

e68bac2af693c7fd7a98d185af5d9975.png

可以看到ros与arduino通信成功. 如果提示"无法打开串口", 请确认串口权限已经配置好, 且没有被其他程序占用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值