在机器人控制中,单片机(Arduino/STM32)与上位机(Raspberry Pi/NVIDIA Jetson nano)之间的通信经常采用串口通信的方式,那应该如何使用STM32的串口通信以及根据自己定义的协议来完成数据的接收与发送呢?在本篇文章中将给你演示如何通过自定协议来完成对电机的控制以及获取编码器的值,跟着我们的配置步骤,你会发现一切如此的简单!

本篇文章依旧采用我们的机器人控制板进行开发,关于电机的相关配置以及驱动代码可以参考前面的文章,本文着重介绍串口通信部分!

1 确定串口的数据协议

'e' 反馈两个电机的编码器脉冲计数值,该计数值达到最大值或最小值时自动清零。

'm' l_speed r_speed 'm'为控制标志,l_speed为左轮的速度值,r_speed为右轮的速度值,该值单位为 cm/s

2 配置串口

为了提高串口通信的效率,减少因为字节传输而不断引起中断导致资源的浪费,可以采用DMA+串口空闲中断的方式对数据进行接收。

DMA

DMA:Direct Memory Access,可以实现一个数据从一个地址空间拷贝到另一个地址空间,并且在数据拷贝过程中无需CPU的干预,在数据拷贝结束后才告知CPU进行处理。因此使用DMA功能可以释放CPU资源。

串口空闲中断

普通的串口处理数据方式为单字节接收,并且接收一帧数据时,需要自行判断帧头帧尾确定是否为一帧完整数据,并且当数据量大会导致频繁进入中断。而采用串口空闲中断,在串口空闲时(发送完一帧数据)产生中断,并且可以在中断服务函数中计算得到的数据长度,对整帧数据进行处理。

STM32CubeMX中的配置

在串口1配置中打开DMA功能,其余配置可参考之前的工程

3 编写驱动代码

创建好工程后,打开工程文件中的stm32f1xx_it.c,找到串口1的中断服务函数,在中断服务函数中加入以下代码。

void USART1_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 */uint32_t tmp_flag = 0;uint32_t temp;tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位if((tmp_flag != RESET))//idle标志被置位{ __HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位HAL_UART_DMAStop(&huart1); temp  =  __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// 获取DMA中未传输的数据个数
​rx_len =  BUFFER_SIZE - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数recv_end_flag = 1;  // 接受完成标志位置1  }HAL_UART_Receive_DMA(&huart1,uart1_rx_buffer,BUFFER_SIZE);//重新打开DMA接收/* USER CODE END USART1_IRQn 0 */HAL_UART_IRQHandler(&huart1);/* USER CODE BEGIN USART1_IRQn 1 */
​/* USER CODE END USART1_IRQn 1 */
}

并且在main函数中的主循环开始前加入使能语句

__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能IDLE中断
HAL_UART_Receive_DMA(&huart1,uart1_rx_buffer,BUFFER_SIZE);

主循环中的代码如下:

while (1){if(recv_end_flag == 1) //串口中断接收标志位{if(uart1_rx_buffer[0] == 0x6d)  //若接收到'm'{if(rx_len <=9)  {leftTargetSpeed = atof(uart1_rx_buffer+1);  //将接收到的字符转换为十进制数rightTargetSpeed = atof(uart1_rx_buffer+4);if(uart1_rx_buffer[2] == 0x2d){leftTargetSpeed = atof(uart1_rx_buffer+1);  //将接收的字符串转换为float类型rightTargetSpeed = atof(uart1_rx_buffer+5);}}else if(rx_len > 9)  {leftTargetSpeed = atof(uart1_rx_buffer+1);rightTargetSpeed = atof(uart1_rx_buffer+5);          }}else if(uart1_rx_buffer[0] == 0x65)  //若接收到'e'{int leftPulse,rightPulse;leftPulse = encoderPulse[0];  //获得当前的编码器脉冲值rightPulse = encoderPulse[1];printf("%d %d\r\n",leftPulse,rightPulse);}recv_end_flag = 0; //标志位置零等待下一次接收rx_len = 0;memset(uart1_rx_buffer,0,rx_len); //初始化接收数组}/* USER CODE END WHILE */}

4 测试结果演示

当发送"m 0 0"时,电机停止,并返回"OK"表示已经成功设置两轮速度

当发送"m 10 10"时,左右轮以10cm/s的速度转动

若要向反方向运动,则发送负的速度值,例如发送"m -10 -10"时,左右轮以10cm/s反向转动

当发送"e"时,可以得到当前编码器脉冲计数值。

这样控制板和上层设备之间的基本的串口控制和通信就建立好啦,快去试试效果吧!

STM32机器人控制开发教程No.4 使用串口通信控制电机(基于HAL库)相关推荐

  1. STM32机器人控制开发教程No.3 使用遥控控制电机/舵机(基于HAL库)

    01 前言 本教程使用的机器人控制板拥有4个带编码器的电机接口,4个舵机接口,串口通信接口.SWD下载调试接口.航模遥控接口.USB5V输出接口以及方便与树莓派直接连接的40PIN接口等,板载资源丰富 ...

  2. STM32机器人控制开发教程No.1驱动电机(基于HAL库)

    01 前言 本教程使用的机器人控制板拥有4个带编码器的电机接口,4个舵机接口,串口通信接口.SWD下载调试接口.航模遥控接口.USB5V输出接口以及方便与树莓派直接连接的40PIN接口等,板载资源丰富 ...

  3. 正点原子STM32F103精英版开发环境搭建并编写第一个程序(使用串口下载,基于HAL库)

    一:软件下载: 使用图形化配置软件:STM32cubeMX,支持HAL库. 1,下载stm32cubeMX; 2,下载STM32f103器件包: 3,下载IED:keil5 arm版本: 4,下载 s ...

  4. 【STM32H7教程】第29章 STM32H7的USART串口基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第29章       STM32H7的USART串口基础知识和 ...

  5. SAP UI5 应用开发教程之三十四 - SAP UI5 应用基于设备类型的页面适配功能(Device Adaptation)试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  6. STM32 串口DMA接收 Openmv / K210 整数、小数字符串数据 (基于HAL库)

    目录 前言 一.工程配置 二.串口DMA部分代码 1.源文件UART_DMA.c 2.头文件UART_DMA.h 3.stm32f1xx_it.c的修改 4.串口收发DMA测试 三.字符串数字提取代码 ...

  7. STM32软件学习笔记(一)基于HAL库的STM32F429单片机串口打印程序

    |版权声明:本文为博主原创文章,转载请注明出处.https://blog.csdn.net/NeverImagine_/article/details/95517664   目前ST官方有提供两种库文 ...

  8. STM32外挂FLASH模拟U盘(基于HAL库)

    STM32外挂FLASH模拟U盘(基于HAL库) 1.背景 1.1这篇文章能给你带来什么 1.2根据你要解决的问题,精确快速跳转到相应位置 1.3我在做完这个后还有不明白的地方,希望能有大触解答困惑 ...

  9. STM32F4 HAL库开发 -- 新建基于 HAL 库的工程模板

    一.STM32CubeF4 固件包下载 下载:STM32CubeF4 MCU Firmware Package 二.新建基于 HAL 库的工程模板 1.新建文件夹 建立一个文件夹为 Template. ...

  10. STM32CubeMX基于HAL库实现简单串口通信

    STM32CubeMX基于HAL库实现简单串口通信 板子:STM32F103C8 编译工具:Keil+STM32CubeMX 烧录工具:FlyMcu 串口调试程序:XCOM 实验要求: 1)设置波特率 ...

最新文章

  1. 95后架构师晒出工资单:狠补了这个,真香...
  2. 最受欢迎 Top 12 Python 开源框架,你都用过吗?
  3. 祝博客园里的所有朋友 新年快乐!
  4. Mac OS X 10.9.3 Beta 8升级教程
  5. hdu 1814 字典序最小的2sat(暴力深搜)
  6. python npy文件_python实现npy格式文件转换为txt文件操作
  7. 【SAP】相关性类型简介
  8. linux服务器网卡做聚合,Linux物理网卡聚合及桥接
  9. Python4 高级特性
  10. iTerm2 快捷键收集
  11. Java基础篇:如何解决成员的访问和继承?
  12. python -- 连接 orclae cx_Oracle的使用
  13. Python练手项目:求解史上最难数独问题
  14. vant 带关闭按钮div_[已解决]vant-ui源码vant-button的几个疑问
  15. 202010118——MML命令
  16. 机器学习(2)——周志华
  17. How to root android Oppo A11w,OPPO A11(移动4G)一键ROOT图文详细教程
  18. 类和函数模板以及特例化
  19. 安装PS出现“由于找不到VCRUNTIME 140_1.dll”的解决方法
  20. 【grpc02】安装protobuf和protoc

热门文章

  1. Hash冲突以及如何解决Hash冲突
  2. 解决Hash冲突的两种策略
  3. 2021年全日期sql(内含工作日,休息日分类)
  4. 常见的物联网通信技术有哪些,是怎么分类的?
  5. Unity2D项目案例及素材
  6. 科学计算机怎么算四分位数,83939数理分析网
  7. 如何使用微信小程序第三方UI组件库
  8. 小米红米有锁机如何刷机升级MIUI12.5系统-完美解锁机刷机教程
  9. android黑域系统文件,优雅地使用安卓手机,黑域免root使用教程
  10. HTML怎么引入字体包中的字体