ROS实现串口通信

虚拟串口的搭建

参考Linux下添加虚拟串口,接收和发送数据
com.py文件代码如下:

#! /usr/bin/env python

#coding=utf-8

import pty
import os
import select

def mkpty():
    #
    master1, slave = pty.openpty()
    slaveName1 = os.ttyname(slave)
    master2, slave = pty.openpty()
    slaveName2 = os.ttyname(slave)
    print '/nslave device names: ', slaveName1, slaveName2
    return master1, master2

if __name__ == "__main__":

    master1, master2 = mkpty()
    while True:        
        rl, wl, el = select.select([master1,master2], [], [], 1)
        for master in rl:
            data = os.read(master, 128)
            if master==master1:
                print "read %d data:" % len(data)
                print data
                #os.write(master2, data)
            else:
                print "to write %d data:" % len(data)
                print data.strip()
                os.write(master1, data.strip())

增加两个虚拟串口,一个可以读取串口数据,一个可以写串口数据。
使用下列命令,可以发送数据到串口(20为新增串口号,为随机生产):

mykylin@ubuntu:~/Desktop$ cd /dev/pts/
mykylin@ubuntu:/dev/pts$ echo 123 > 20

图形界面的串口工具安装

$ sudo apt-get install cutecom
$ cutecom

用上面的命令,就可以安装和启动它了。
然后,便可以在图形界面下,选择串口和设置参数(波特率,数据位,校验位);
然后,就可以打开设备(Open Device),然后,就可以收发数据了!Device处选择/dev/pts/串口号。

ROS实现串口通信

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import rospy
import std_msgs.msg
from geometry_msgs.msg import Twist
import serial
import time
import threading


ser = serial.Serial(port='/dev/pts/21', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=2,rtscts=True,dsrdtr=True)
time.sleep(1)
pub = rospy.Publisher('serial_data_odom', Twist, queue_size=1)  
rospy.init_node('serial_data_contral', anonymous=True)  #初始化节点
rate = rospy.Rate(20) #设置后面程序读取串口的频率
while not rospy.is_shutdown(): #下面是用于读取串口发来的数据
     #get_str = ser.readline()  #读取串口数据,以换行符为结束
     ser.write('10086')
     # get_str = get_str.strip() 
     #if len(get_str)>0:
         #print(get_str)
     rate.sleep()

这里代码并不完整,主要是看下串口的实例化方式。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用ROS和Boost库实现串口通信的案例: 1. 在ROS工作空间中创建一个新的ROS包,例如“serial_communication”。 2. 在src目录下创建一个名为“serial_communication_node.cpp”的节点文件,并编写以下代码: ```c++ #include <ros/ros.h> #include <boost/asio.hpp> #include <boost/bind.hpp> #define SERIAL_PORT "/dev/ttyUSB0" // 串口号 #define BAUD_RATE 115200 // 波特率 class SerialCommunicationNode { public: SerialCommunicationNode() : io_service_(), serial_port_(io_service_) { // 打开串口 serial_port_.open(SERIAL_PORT); serial_port_.set_option(boost::asio::serial_port_base::baud_rate(BAUD_RATE)); // 创建定时器 timer_ = nh_.createTimer(ros::Duration(0.1), boost::bind(&SerialCommunicationNode::readSerialData, this)); } void readSerialData() { // 读取串口数据 boost::asio::async_read(serial_port_, boost::asio::buffer(buffer_), boost::asio::transfer_at_least(1), boost::bind(&SerialCommunicationNode::handleRead, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); } void handleRead(const boost::system::error_code& error, size_t bytes_transferred) { if (!error) { // 将读取到的串口数据发布为ROS消息 std_msgs::String msg; msg.data = std::string(buffer_.begin(), buffer_.begin() + bytes_transferred); serial_data_pub_.publish(msg); } } private: ros::NodeHandle nh_; ros::Publisher serial_data_pub_ = nh_.advertise<std_msgs::String>("serial_data", 1); ros::Timer timer_; boost::asio::io_service io_service_; boost::asio::serial_port serial_port_; std::vector<uint8_t> buffer_; }; int main(int argc, char** argv) { ros::init(argc, argv, "serial_communication_node"); SerialCommunicationNode node; ros::spin(); return 0; } ``` 3. 在CMakeLists.txt中添加以下内容: ``` find_package(Boost REQUIRED COMPONENTS system thread) include_directories(${Boost_INCLUDE_DIRS}) add_executable(serial_communication_node src/serial_communication_node.cpp) target_link_libraries(serial_communication_node ${Boost_LIBRARIES}) ``` 4. 构建并运行ROS节点: ``` catkin_make rosrun serial_communication serial_communication_node ``` 5. 在另一个终端中,使用roscore启动ROS核心,并使用rostopic命令检查是否已发布“serial_data”主题: ``` roscore rostopic list ``` 6. 将串口设备连接到计算机上,并使用minicom或其他串口工具发送数据。这将导致ROS节点将读取的数据作为ROS消息发布到“serial_data”主题中。 ``` minicom -b 115200 -D /dev/ttyUSB0 ``` 7. 最后,您可以使用rostopic echo命令来查看从串口读取的数据: ``` rostopic echo serial_data ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值