这么简单… 有包的我竟然想尝试… 自己写 /笑哭,最重要是写了一个下午 一直卡在一个函数的头文件明明包含了 却一直警告未定义,是改的rplidar的serial串口,本来想写一个自己以后数据校验方便很多用的;但是师兄过来看了一眼,然后… 告诉我库也可以取十六进制 你没看仔细文档说明(见附录)。所以在师兄告诉我之后,我觉得就是简单我还是写一下给后面像我这样的同学一个参考。
首先,STM32这边我就不写串口读写的了,直接拿CUBE配好了,UART3,DMA传输传感器的ADC(红外测距传感器),截图放一下串口配置(标黄)
然后DMA打开,配置NVIC中断等一系列,之所以放这个是… 后面ROS那边得看波特率。
UART_DMA_RX_INIT(&huart3, uart3_rx, UART3_MAX_LEN);
__HAL_DMA_DISABLE(huart3.hdmatx);
huart3.hdmatx->Instance->CPAR = (u32)&huart3.Instance->DR;
huart3.hdmatx->Instance->CNDTR = 10;
huart3.hdmatx->Instance->CMAR = NULL;
__HAL_DMA_ENABLE_IT(huart3.hdmatx, DMA_IT_TC);
SET_BIT(huart3.Instance->CR3, USART_CR3_DMAT);
UART3_Transmit_DMA(uart3_temp_data, uart3_length);//这是我的发送函数
… 再来放一下!DMA除了CUBE的初始化,还得自己INIT一些,开启RX接收,配置寄存器,这一系列请参照STM32参考手册/原子哥那边的pdf都ok,我也是… 现学现用,没理解那么多,用就行了。(实在要源码… 有人要再说吧… 因为这边有点简单 大家查一查,结束,主要还是告诉ROS那边读取的几个函数
sudo apt-get install ros-kinetic-serial
#include //ROS已经内置了的串口包
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
genmsg
geometry_msgs
serial ##是这个!!
)
serial::Serial ser;; //声明serial对象
打开串口的一系列操作,这里注意查看自己的USB是几,查看方式
ls /dev/ttyUSB
还得注意给权限(这个虽然没坑到我,但是… 坑到过其他人,666的权限和777有所不同 串口666就够了,777似乎是所有全开
sudo chmod 666 /dev/ttyUSB0
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 port ");
return -1;
}
//检测串口是否已经打开,并给出提示信息
if(ser.isOpen())
{
ROS_INFO_STREAM("Serial Port initialized");
}
else
{
return -1;
}
ROS_INFO_STREAM("Init Finished!");
//指定循环的频率
非常重要!的读取函数 ser.read(result,result_size)
if(ser.available())
{
result_size=ser.available();
result_size = ser.read(result,result_size);
for(int i=0 ;i<result_size; i++)
{
if(result[i]==0xAA && result[i+1] == 0x55)
{
IR_sensor[0]=result[i+2]+40;
IR_sensor[1]=result[i+3]+40;
IR_sensor[2]=result[i+4]+40;
IR_sensor[3]=result[i+5]+40;
break;
}
}
ROS_INFO("Read: %d",IR_sensor[0]);
//printf("%d\r\n",IR_sensor[0]);
}
result_size=ser.available();
result_size = ser.read(result,result_size);
这两句,第一句是读取长度,available是收到消息返回数值,第二句是读取数据(uint_8 result[30]),第一个参数是uint_8类型的,第二个Int。
如果是转换字符的话,请转至其他博主博客查看:
ROS环境下串口通信 作者:笑看零一
附录学习的几个链接:
ROS官方的doc: Serial的所有函数介绍
截图函数介绍:
趁着还能在CSDN有心思记录一下,有问题可以大家一起交流…