小熊派开发笔记-串口读取RS485输出的土壤七合一传感器数据(基于STM32CubeMX)

Posted Apple_Coco

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小熊派开发笔记-串口读取RS485输出的土壤七合一传感器数据(基于STM32CubeMX)相关的知识,希望对你有一定的参考价值。

环境

  • JRE(Java Runtime Environment)
  • STM32CubeMX v6.3.0
  • HAL 库 L4 v1.7.0
  • Keil5-MDK

环境搭建参考:STM32CubeMX学习记录–安装配置与使用

如果不想去官网下,也可以从我的百度云分享里下载 STM32CubeMX 和 HAL 库

链接:https://pan.baidu.com/s/10MKGKPNQrIxZnuMZvVKqkg
提取码:zjor

硬件

  • 小熊派开发板

  • 土壤七合一传感器(水分、温度、电导率、氮磷钾、PH值)

  • RS485 转 TTL 模块

接线图

  • 小熊派的 5v 电源接土壤传感器的 电源正
  • 小熊派的 GND 接土壤传感器的 电源地
  • 小熊派的 3.3v 电源接转接模块的 VCC
  • 小熊派的 GND 接转接模块的 GND
  • 小熊派的 UART2_TX 接转接模块的 TXD
  • 小熊派的 UART2_RX 接转接模块的 RXD
  • 转接模块的 A+ 接土壤传感器的 485-A
  • 转接模块的 B- 接土壤传感器的 485-B

创建工程

打开 STM32CubeMX,选择新建一个工程,如下图

在输入框中输入 stm32l431rc,选中,然后双击选择中间 LQFP64 的这款,如下图

查看原理图,KEY1 按键对应的引脚为 PB2,如下图

在 STM32CubeMX 中选择 PB2 引脚输出模式为 GPIO_input

设置 PB2 输出方式和别名,如下图

设置 UART1 为异步输出,该串口是用来和 PC 端进行通信,波特率就用默认的 115200,如下图

设置 UART2 为异步输出,该串口用来和土壤传感器进行通信,我们上面的硬件接线也是使用的是 UART2 串口。土壤传感器的波特率为 9600,所以工程里该串口波特率设置为 9600,如下图

时钟使用内部默认时钟,设置为最高 80MHz

最后配置生成工程设置,如下图

最后选择右上角的 GENERATE CODE,即可完成工程的创建

在 Keil5-MDK 中编写代码

进入 MDK-ARM 目录,打开工程,在 usart.c 中编写如下代码

/* USER CODE BEGIN 1 */
int fputc(int ch, FILE *file)
{
	uint8_t temp[1] = {ch};
	HAL_UART_Transmit(&huart1, temp, 1, 0xff);
	return HAL_OK;
}
/* USER CODE END 1 */

并在该文件头部添加头文件

/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 */

重写 fputc 可以将 printf 函数的输出重定向到 uart1 串口上,就可以通过串口助手显示出来

main.c 中,首先添加头文件

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

然后在 main 函数的 while 循环中编写如下代码

/* USER CODE BEGIN 3 */
// 如果检测到 KEY1 按下
if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET)
{
    // 按键去抖
    HAL_Delay(20);
    while (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET);
    HAL_Delay(20);
    
    // 发送问询帧
    uint8_t askData[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x04, 0x44, 0x09};
    HAL_UART_Transmit(&huart2, askData, 8, 0xff);
    
    // 接收应答帧
    uint8_t result[13];
    HAL_UART_Receive(&huart2, result, 13, 0xff);
    for (int i = 0; i < 13; i++)
    {
        printf(" %x ", result[i]);
    }
}

这里的 HAL_UART_TransmitHAL_UART_Receive 都是用的 uart2 串口,向我们的土壤传感器发送和接收数据。

查阅土壤传感器的用户手册,想要获取数据,要先发送一个问询帧,如下

因此,我们根据用户手册里的示例,向 uart2 串口发送一个如代码所示的问询帧,然后接收返回来的应答帧,最后输出到串口助手上就好啦

编译、烧录程序

勾选 MicroLIB 库很重要,不然会无法向串口助手输出数据

勾选 reset and run 可以让程序烧录完成后自动运行。

设置完成后点击确定,OK

点击编译,然后烧录,下图所示表示烧录成功

打开串口助手,这里我用的是 QCOM。打开端口,然后按下小熊派的 KEY1 按键,可以看到串口助手打印出了应答帧的信息,如下图

根据土壤传感器的用户手册,可以解析出温度数据为:0x01 0x03(十六进制) = 259(十进制),所以当前温度为 25.9 ℃

世界上最幸运的事莫过于可以学习自己喜欢的知识~

以上是关于小熊派开发笔记-串口读取RS485输出的土壤七合一传感器数据(基于STM32CubeMX)的主要内容,如果未能解决你的问题,请参考以下文章

labview怎么读取RS485转网口的数据

如何修复 rs232 串口超时?

如何用电脑读取485接口的电表数据

RS485与RS232编程区别

H7-TOOL串口脱机烧录操作说明,支持TTL串口,RS232和RS485(2022-06-30)

如何在电脑上通过RS485接口读取PMC-630A三相数字式多功能测控电表。最好能写上详细过程。功能码为0x03.