在ROS中与其他器件使用十六进制串口通信

      第一次自己写博客,有什么问题请@我。

首先非常感谢一位网友的博客(点击打开链接),他在ros上使用了串口通信,不过使用的是字符串,因为项目需要,我在其基础了改成十六进制,并发布接收十六进制数组主题。

需要特别说明的是,你根据上面这个博客(点击打开链接)在进行自定义你的消息时,如果是同一工作空间

add_dependencies(test1 test_msgs_gencpp)#调用同一工作空间的自定义消息类型时注明依赖关系,防止发生头文件找不到报错
在添加上面一行代码后还找不到头文件时, 需要在 CMakeLists.txt 文件中添加这行代码,否则找不到msg.h文件  


点击打开链接微笑我在这里卡了好久,一直找不到自己生成信息的.h文件,后来才发现的。

现在说到主题了,如何传输十六进制数。

首先 定义自定义.msg文件。

uin8[] serial
此类数组实际上是vector类型,它并没有定义长度,你可以使用几种方法赋值,具体参考( 点击打开链接)。vector类型还有一个很好的文章是( 点击打开链接)写的很nice,收益很多。从串口读写数据的函数为serial包中的
 ser.read(r_buffer,rBUFFERSIZE);
 ser.write(r_buffer,rBUFFERSIZE);
具体可参考链接( 点击打开链接

还有一个小的知识点,如果你编译时找不到catkin包中安装的头文件,即就是你在catkin-ws中安装了serial包,但是在安装其他包时需要serial/serial.h的头文件却找不到时,需要在CMakeLists.txt 文件中添加这行代码,否则找不到catkin空间中的包

Include_directiones(catkin_include_dirs)

总结一下,学好C++,感谢各位博主。大笑

最后放上我的源码链接(点击打开链接

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
ROS ,可以通过自定义消息类型来表示接收到的十六进制串口数据,然后将其发布出去。下面是实现的步骤: 1. 创建一个名为 "MyMessage" 的消息类型,包含一个名为 "data" 的字节数组: ``` byte[] data ``` 2. 在 ROS 节点,订阅串口消息。可以使用 ROS 自带的 serial 包或者第三方的库,如 Boost.Asio 库等来实现。在回调函数,将接收到的十六进制串口数据转换成字节数组,并填充到自定义消息类型的 "data" 变量。 ```cpp #include "my_package/MyMessage.h" #include "ros/ros.h" #include <boost/asio.hpp> void serialCallback(const boost::system::error_code& error, std::size_t bytes_transferred, boost::asio::serial_port& serial_port, ros::Publisher& publisher) { if (!error) { // Read data from serial port std::vector<uint8_t> buffer(bytes_transferred); boost::asio::read(serial_port, boost::asio::buffer(buffer)); // Convert hex string to byte array std::vector<uint8_t> bytes; for (int i = 0; i < buffer.size(); i += 2) { std::string hex = std::string(buffer.begin() + i, buffer.begin() + i + 2); uint8_t byte = std::stoi(hex, nullptr, 16); bytes.push_back(byte); } // Publish data as MyMessage type my_package::MyMessage msg; msg.data = bytes; publisher.publish(msg); } else { ROS_ERROR("Error reading serial port: %s", error.message().c_str()); } } int main(int argc, char** argv) { ros::init(argc, argv, "my_node"); ros::NodeHandle nh; ros::Publisher my_publisher = nh.advertise<my_package::MyMessage>("my_topic", 10); // Open serial port boost::asio::io_service io_service; boost::asio::serial_port serial_port(io_service, "/dev/ttyUSB0"); serial_port.set_option(boost::asio::serial_port_base::baud_rate(115200)); // Start reading from serial port boost::asio::async_read(serial_port, boost::asio::buffer(buffer), boost::asio::transfer_at_least(1), boost::bind(&serialCallback, _1, _2, boost::ref(serial_port), boost::ref(my_publisher))); ros::spin(); return 0; } ``` 在上述代码,我们使用了 Boost.Asio 库来读取串口数据。在回调函数 serialCallback ,我们首先将接收到的十六进制串口数据转换成字节数组,然后填充到自定义消息类型 MyMessage 的 "data" 变量。最后,通过 my_publisher 发布该消息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值