提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
-
所需用具
- stm32f103c8t6最小系统板
- stlink
- usb-ttl
ps:这里我用的是虚拟机,本质上是ros的串口通信
32的代码这里没有,有需要可以去下载江科大的源码或者私信我
提示:以下是本篇文章正文内容,下面案例可供参考
一、安装文件
一定需要的文件
sudo apt-get install ros-noteic-serial
串口助手
sudo apt-get install cutecom
vscode串口助手插件:Serial Monitor
二、开始!
硬件连接
STLink正常连接
usb—ttl只需要连接串口1(A9:TX A10:RX)
全部连接在电脑上
因为我使用的是虚拟机,可以一边在win下使用keil,一边开虚拟机ros
ros准备 1
新建一个功能包,要求带有 roscpp serial std_msgs
这三个依赖
代码如下:
#include <ros/ros.h>
#include <serial/serial.h>
#include <std_msgs/String.h>
#include <std_msgs/Empty.h>
serial::Serial ser; // 创建一个名为ser的serial对象
void write_callback(const std_msgs::String::ConstPtr& msg){
ROS_INFO_STREAM("Writing to serial port " << msg->data); // 输出写入串口的信息
ser.write(msg->data); // 将收到的消息写入串口
}
int main (int argc, char** argv){
ros::init(argc, argv, "serial_example_node"); // 初始化ROS节点
ros::NodeHandle nh; // 创建节点句柄
ros::Subscriber write_sub = nh.subscribe("write", 1000, write_callback); // 订阅"write"主题,设置消息队列长度为1000,收到消息时调用write_callback函数
ros::Publisher read_pub = nh.advertise<std_msgs::String>("read", 1000); // 发布"read"主题,设置消息队列长度为1000
try
{
ser.setPort("/dev/mcu_uart"); // 设置串口名称
ser.setBaudrate(9600); // 设置波特率
serial::Timeout to = serial::Timeout::simpleTimeout(1000); // 设置超时时间
ser.setTimeout(to); // 应用超时设置
ser.open(); // 打开串口
}
catch (serial::IOException& e)
{
ROS_ERROR_STREAM("Unable to open port "); // 输出错误信息
return -1; // 返回错误码
}
if(ser.isOpen()){
ROS_INFO_STREAM("Serial Port initialized"); // 输出串口初始化成功信息
}else{
return -1; // 返回错误码
}
ros::Rate loop_rate(5); // 设置循环频率
while(ros::ok()){
ros::spinOnce(); // 执行一次回调函数
if(ser.available()){ // 如果串口有数据可读
ROS_INFO_STREAM("Reading from serial port"); // 输出从串口读取信息
std_msgs::String result; // 创建用于存储读取数据的消息对象
result.data = ser.read(ser.available()); // 读取串口中的数据
ROS_INFO_STREAM("Read: " << result.data); // 输出读取的数据
read_pub.publish(result); // 发布读取到的数据到"read"主题
}
loop_rate.sleep(); // 根据循环频率进行休眠
}
}
更改cmakelists文件
add_executable(serial_example_node src/serial_example_node.cpp)
target_link_libraries(serial_example_node
${catkin_LIBRARIES}
)
ros准备 2
确定自己的设备名称(方便后面使用)
步骤1:虚拟机连接上串口
步骤2:查看端口号
lsusb
可以看到第二个就是我们需要绑定的端口
步骤3:进入设备管理文件夹
cd /etc/udev/rules.d/
/etc/udev/rules.d/ 目录通常用于存放 udev 规则文件。udev 是 Linux 内核中的设备管理器,负责处理与设备相关的事件和信息
步骤4:创造一个规则
sudo touch usb.rules
sudo nano usb.rules
KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="my_uart"
还是这张图片,鼠标的位置有标识。0777不需要更改
步骤5:重置设备
sudo /etc/init.d/udev restart
之后重新插拔usb
ls -l /dev |grep ttyUSB
测试
我的32代码就是发送0x41,对应过来的字母就是A
看看发送
基本ok
完结撒花!