两台电脑完成ros串口通信,一台电脑上的串口调试助手发送一组数据,含字节头字节尾和需要输出的数;在另一台电脑的ros写一个C++程序,用于接收发来的字节头与字节尾之间的数据,并在终端显示
时间: 2024-05-03 12:22:45 浏览: 10
程序思路如下:
1. 在另一台电脑上安装ros,并创建一个新的ROS工作空间。
2. 在工作空间中创建一个新的ROS包,并在包中创建一个新的ROS节点,用于接收串口数据。
3. 在节点中订阅串口数据的话题,并编写回调函数。
4. 在回调函数中解析接收到的数据,提取需要输出的数,并在终端显示。
下面是具体的程序实现:
1. 创建ROS工作空间并新建ROS包和节点
打开终端,输入以下命令:
```
mkdir -p ~/ros_serial_test_ws/src
cd ~/ros_serial_test_ws/src
catkin_init_workspace
cd ~/ros_serial_test_ws/
catkin_make
source devel/setup.bash
cd src
catkin_create_pkg serial_test rospy
cd serial_test
mkdir src
cd src
touch serial_receiver.py
chmod +x serial_receiver.py
```
2. 编辑serial_receiver.py文件
在serial_receiver.py文件中,添加以下代码:
```python
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
def callback(data):
# 解析串口数据,提取需要输出的数
serial_data = data.data
# 判断数据是否合法
if len(serial_data) >= 3 and serial_data[0] == 0x01 and serial_data[-1] == 0x02:
output_data = serial_data[1:-1]
output_str = ''
for byte in output_data:
output_str += str(byte) + ' '
# 在终端显示输出的数
rospy.loginfo("Output data: %s", output_str)
else:
rospy.logwarn("Invalid serial data: %s", serial_data)
def serial_receiver():
# 初始化ROS节点
rospy.init_node('serial_receiver', anonymous=True)
# 订阅串口数据的话题
rospy.Subscriber("serial_data", String, callback)
# 循环等待回调函数
rospy.spin()
if __name__ == '__main__':
serial_receiver()
```
代码注释:
- `import rospy`:导入ROS Python库。
- `from std_msgs.msg import String`:导入ROS标准消息库中的String类型。
- `def callback(data)`:定义回调函数,处理接收到的串口数据。
- `serial_data = data.data`:获取串口数据。
- `if len(serial_data) >= 3 and serial_data[0] == 0x01 and serial_data[-1] == 0x02:`:判断串口数据是否合法。合法的数据应该包含字节头、字节尾和需要输出的数,字节头为0x01,字节尾为0x02。
- `output_data = serial_data[1:-1]`:提取需要输出的数。
- `output_str = ''`:初始化输出字符串。
- `for byte in output_data: output_str += str(byte) + ' '`:将需要输出的数转换成字符串。
- `rospy.loginfo("Output data: %s", output_str)`:在终端显示输出的数。
- `rospy.logwarn("Invalid serial data: %s", serial_data)`:在终端显示无效的串口数据。
- `def serial_receiver()`:定义主函数,初始化ROS节点,订阅串口数据的话题,循环等待回调函数。
- `if __name__ == '__main__': serial_receiver()`:如果该模块是程序的入口,则执行主函数。
3. 编写串口调试助手
打开串口调试助手,设置串口参数和发送数据。发送的数据应包含字节头、字节尾和需要输出的数。
例如,发送以下数据:
```
01 12 34 56 78 02
```
其中,0x01表示字节头,0x02表示字节尾,0x12 0x34 0x56 0x78表示需要输出的数。
4. 运行程序
打开终端,输入以下命令:
```
cd ~/ros_serial_test_ws/
source devel/setup.bash
rosrun serial_test serial_receiver.py
```
如果一切正常,终端应该显示输出的数:
```
[INFO] [1631924142.116638]: Output data: 18 52 86 120
```
如果串口数据不合法,终端应该显示无效的串口数据:
```
[WARN] [1631924256.524063]: Invalid serial data: 01 12 34 56
```