Linux与STM32串口通信
author:yangdong
date:24/3/9
1.安装串口通信包
1.ROS串口包安装:
sudo apt-get install ros-<你的ROS版本>-serial
2.python串口包安装:
pip install pyserial
2.代码实现:
2.1 Linux端ROS c++代码
my_serial.h
#include "ros/ros.h"
#include <time.h>
#include <string>
#include <iostream>
#include <serial/serial.h>
using namespace std;
class SerialPort
{
public:
SerialPort(string port, int rate);
~SerialPort();
void SendData();
void ReceiveData();
private:
serial::Serial sp;
serial::Timeout to;
};
my_serial.cpp
#include "my_serial.h"
SerialPort::SerialPort(string port, int rate)
{
to = serial::Timeout::simpleTimeout(100);
// 设置要打开的串口名称
sp.setPort(port);
// 设置串口通信的波特率
sp.setBaudrate(rate);
// 串口设置timeout
sp.setTimeout(to);
// 打开串口
try
{
sp.open();
}
catch(serial::IOException& e)
{
ROS_ERROR_STREAM("Unable to open port.");
}
if(sp.isOpen())
{
ROS_INFO_STREAM("/dev/ttyUSB0 is opened.");
}
else
{
ROS_ERROR_STREAM("port is not Open");
}
}
SerialPort::~SerialPort()
{
}
void SerialPort::SendData()
{
uint8_t tx_data = 0x22;
sp.write(&tx_data, 1);
ROS_INFO("is in send");
// usleep(10000); // 添加延时,确保接收到的数据有足够的时间被接收端处理
}
void SerialPort::ReceiveData()
{
uint8_t rx_data = 0x00;
sp.read(&rx_data, 1); // 接收一个字节数据到 uint8_t 类型变量
ROS_INFO("rx_data:%02X", rx_data); // 以十六进制格式输出 uint8_t 数据
// usleep(10000);
}
int main(int argc, char **argv)
{
SerialPort sport("/dev/ttyUSB0", 115200);
while (1)
{
sport.SendData();
// ROS_INFO("is in send");
sport.ReceiveData();
}
return 0;
}
CMakeLists.txt
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
serial 添加serial
std_msgs
)
include_directories(
include
include/${PROJECT_NAME}
${catkin_INCLUDE_DIRS}
)
add_executable(my_serial src/my_serial.cpp)
add_dependencies(my_serial ${PROJECT_NAME}_gencpp)
target_link_libraries(my_serial
${catkin_LIBRARIES}
)
2.2 Linux端python代码
# -*- coding: utf-8 -*-
import serial
import time
pi_serial = serial.Serial('/dev/ttyUSB0', 115200)
if __name__ == '__main__':
if pi_serial.isOpen(): # 判断串口是否成功打开
print("打开串口成功!! ")
else:
print("串口打开失败!!")
while True:
print("is in send")
pi_serial.write(b'w')
time.sleep(0.01)
2.3 STM32代码实现
usart.c
//串口1中断服务函数接收
void USART1_IRQHandler(void) //串口1中断服务程序
{
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
}
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntExit();
#endif
}
#endif
//串口发送代码
void USART1_SendData(uint8_t *pbuf)
{
uint8_t tx_data;
tx_data = *pbuf;
USART_SendData(USART1, tx_data);
}
!!!注意:
-
串口中断服务函数中的 Res 变量要定义成全局变量才可以在下一步的调试中查看它的值
-
串口传输的双方最好以uint_8的方式传输和接收数据
3 STM32串口调试
3.1设备连接
3.1.1Linux端连接STM32串口
3.1.2 STLink连接到主机
3.2Linux端运行代码
3.2.1查看串口
ls -l /dev/ttyUSB*
3.2.2给串口设备权限
sudo chmod 777 /dev/ttyUSB*
3.2.3运行代码
ROS运行代码
rosrun 功能包 节点
python运行代码
python 文件名
3.3开始调试
3.3.1 点击keil右上角放大器这个按钮进入调试
3.3.2.把Res变量添加进Watch
3.3.3查看串口接收到的数据
可以看到我们收到的数据是字母“w”,对应的16进制是0x77