ROS端
程序使用ROS的串口通信库“serial”与STM32通信,并使用ROS的节点来发布和订阅消息
#include <ros/ros.h>
#include <serial/serial.h>
#include <std_msgs/String.h>
#include <std_msgs/Empty.h>
serial::Serial ser; // 声明一个串口对象
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_node"); // 初始化ROS节点
ros::NodeHandle nh; // 声明节点句柄
ros::Subscriber write_sub = nh.subscribe<std_msgs::String>("serial_write", 1000, write_callback); // 声明一个订阅者,用于接收需要发送给STM32的数据
ros::Publisher read_pub = nh.advertise<std_msgs::String>("serial_read", 1000); // 声明一个发布者,用于发布从STM32读取到的数据
try
{
ser.setPort("/dev/ttyUSB0"); // 设置串口端口
ser.setBaudrate(115200); // 设置串口波特率
serial::Timeout to = serial::Timeout::simpleTimeout(1000); // 设置串口超时时间
ser.setTimeout(to);
ser.open(); // 打开串口
}
catch (serial::IOException& e)
{
ROS_ERROR_STREAM("Unable to open serial port!");
return -1;
}
if (ser.isOpen())
{
ROS_INFO_STREAM("Serial port initialized!");
}
else
{
return -1;
}
ros::Rate loop_rate(50); // 设置ROS循环频率
while (ros::ok())
{
if (ser.available())
{
std_msgs::String result;
result.data = ser.read(ser.available()); // 从串口读取数据
ROS_INFO_STREAM("Read from serial port: " << result.data);
read_pub.publish(result); // 发布读取到的数据
}
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
2.在STM32端
编写一个程序来监听串口并接收数据。以下是一个示例程序,用于接收来自上述C++程序的数据并将其打印到终端:
#include "stm32f4xx.h"
#include "stm32f4xx_hal.h"
#include <string.h>
UART_HandleTypeDef huart1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
while (1)
{
uint8_t data[100];
memset(data, 0, sizeof(data));
HAL_UART_Receive(&huart1, data, sizeof(data), 1000); // 从串口接收数据
if (strlen((char*)data) > 0)
{
printf("Received data: %s\n", data); // 打印接收到的数据
}