ros与stm32串口实现

ros与stm32串口实现

十二月 09, 2018

每一个奋斗的日子都不应辜负

listener

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <ros/ros.h>

#include <serial/serial.h> //ROS已经内置了的串口包

#include <std_msgs/String.h>

#include <std_msgs/Empty.h>

#include "uart/uartmsg.h"


serial::Serial ser; //声明串口对象

//回调函数

void write_callback(const std_msgs::String::ConstPtr &msg)

{

ROS_INFO("write the data:%s",msg->data.c_str());

ser.write(msg->data); //发送串口数据

}

int main (int argc, char** argv)

{

//初始化节点 <<

ros::init(argc, argv, "serial_example_node");

//声明节点句柄

ros::NodeHandle nh;

//订阅主题,并配置回调函数

ros::Subscriber write_sub = nh.subscribe("write", 1000, write_callback);

//发布主题

ros::Publisher read_pub = nh.advertise<std_msgs::String>("read", 1000);

try

{

//设置串口属性,并打开串口

ser.setPort("/dev/ttyUSB0");

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(1);

while(ros::ok())

{

if(ser.available()){

ROS_INFO_STREAM("Reading from serial port\n");

std_msgs::String result;

result.data = ser.read(ser.available());

ROS_INFO("Read: %s",result.data.c_str());

read_pub.publish(result);

}



//处理ROS的信息,比如订阅消息,并调用回调函数

ros::spinOnce();

loop_rate.sleep();
}
}

talker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <std_msgs/Empty.h>
#include "uart/uartmsg.h"
#include <sstream>
int main(int argc, char** argv)
{
ros::init(argc, argv, "talker");
ros::NodeHandle nh;
std_msgs::String msg;
std::stringstream ss;
ss << "1\r\n";
msg.data = ss.str();

ros::Publisher pub=nh.advertise<std_msgs::String>("write",1000);

ros::Rate loop_rate(1.0);

while (ros::ok())
{
msg.data = ss.str();
pub.publish(msg);
ROS_INFO("Talker: %s",msg.data.c_str());
loop_rate.sleep();
}


return 0;
}

talker向stm32发送1信息(注意\r\n),启动listener接收返回信息。可直接使用正点原子编写的串口程序测试。