weixin_58085011 2024-04-11 16:31 采纳率: 75%
浏览 41

RS485接收数据不正确

用STM32F429测试RS485通讯,采用激光位移传感器作为输入源给出RS485信号,采用TTL转RS485模块进行转化,连接到开发板USART外设上,通过USART外设读取数据。参数设置与传感器标定相同(波特率9600,8N1)。
该传感器用电脑解析软件读出数值为213,与实际相符,但用STM32读出的数值是59,与实际距离不符。一开始怀疑是读取数据类型uint8_t不对,改成uint16_t问题现象一样。
求有经验人士指教,谢谢

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-11 16:31
    关注

    引自免费微信小程序:皆我百晓生

    首先,我们需要检查几个关键点来定位问题所在:

    1. 串口配置:确保STM32F429的USART配置正确无误。
    2. 数据格式:确认从传感器发送的数据是否按照预期的格式到达。
    3. 数据处理:在STM32端,确保正确地解码接收到的数据。

    下面是一个详细的步骤指南以及相应的代码示例,用于帮助您解决这个问题。

    步骤一:检查USART配置

    确保STM32F429的USART配置与传感器和TTL转RS485模块匹配。这包括波特率、数据位数、停止位和校验位。在STM32CubeMX中配置USART,然后生成代码并包含相关头文件。以下是配置示例:

    // 在main.c或其他合适的地方添加以下内容
    #include "stm32f4xx_hal.h"
    
    void configure_USART(void) {
        GPIO_InitTypeDef GPIO_InitStruct;
        USART_InitTypeDef USART_InitStruct;
    
        // 配置GPIO引脚
        GPIO_InitStruct.Pin = GPIO_PIN_2; // 根据实际连接的引脚修改此行
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF7_USART1; // 如果使用USART1,否则根据实际使用的USART修改
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
        // 初始化USART
        USART_InitStruct.BaudRate = 9600;
        USART_InitStruct.WordLength = UART_WORDLENGTH_8B;
        USART_InitStruct.StopBits = UART_STOPBITS_1;
        USART_InitStruct.Parity = UART_PARITY_NONE;
        USART_InitStruct.HwFlowCtrl = UART_HWCONTROL_NONE;
        USART_InitStruct.Mode = UART_MODE_RX_TX;
        HAL_UART_Init(UART_HandleTypeDef.Instance); // 将UART_HandleTypeDef.Instance替换为实际的USART句柄
    }
    

    步骤二:数据接收

    在主循环中,使用HAL_UART_Receive()函数接收数据,并将其存储在一个缓冲区中。这里我们先用uint8_t来接收数据,因为原始值可能在0-255之间。

    // 在主循环中添加以下内容
    uint8_t received_data[2]; // 假设数据长度为2个字节,根据实际情况调整
    int data_length = 0;
    
    while (1) {
        if (HAL_UART_RxCpltCallback(UART_HandleTypeDef.Instance) != HAL_OK) {
            // 处理错误
        }
    
        while (HAL_UART_GetRxLevel(UART_HandleTypeDef.Instance) > 0) {
            uint8_t byte_received = (uint8_t)HAL_UART_Receive(UART_HandleTypeDef.Instance, &received_data[data_length], 1, 100);
            data_length++;
        }
    
        if (data_length == 2) { // 假设每次接收两个字节
            uint16_t decoded_data = (received_data[1] << 8) | received_data[0];
            printf("Received: %d\n", decoded_data);
            data_length = 0; // 清零计数器,准备接收新的数据
        }
    }
    

    这段代码会将接收到的两个字节组合成一个uint16_t变量。如果传感器发送的数据长度不是固定的2个字节,请相应调整数组大小和判断条件。

    步骤三:其他可能的问题

    1. 检查TTL转RS485模块的电源和接地是否正常。
    2. 确保物理层连接没有问题,例如线缆接触不良或极性错误。
    3. 调试时,可以尝试在STM32和电脑间建立回环通信,即STM32发送给电脑,再由电脑转发给STM32,看数据是否一致。

    如果以上步骤都正确,但问题仍然存在,请提供更具体的信息,如接收到的具体字节序列,以便进一步分析。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月11日

悬赏问题

  • ¥20 为什么安装CSiBridge时出现了这个问题,尝试了很多方法都不行,求详细操作步骤?
  • ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除
  • ¥15 使用MATLAB进行余弦相似度计算加速
  • ¥15 服务器安装php5.6版本
  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题
  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
  • ¥15 arcgis处理土地利用道路 建筑 林地分类
  • ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
  • ¥100 寻会做云闪付tn转h5支付链接的技术