嵌入式小白板 2025-04-01 16:46 采纳率: 0%
浏览 6

读取485传感器每一位都接收两遍

采用串口接收中断的方式读取485土壤传感器数值,为什么每个位都接收了两遍呀,
这是main函数的调用

        RS485_Send_Buf(TR_Read);

        HAL_Delay(300);


        RS485_Receive_Buf(rs485buf,14);
        SD=(rs485buf[3]*256+rs485buf[4])/10;
        //SD=(rs485buf[5]*256+rs485buf[6])/10;
        //printf("½ÓÊÕµ½µÄζÈÊý¾ÝΪ£º%d",WD);
        printf("½ÓÊÕµ½µÄʪ¶ÈÊý¾ÝΪ£º%d\r\n",SD);

这是发送和接收函数

void RS485_Send_Buf(uint8_t *buf1)
{
    sp3485_tx_enable;            //ÉèÖÃΪ·¢ËÍģʽ
    HAL_UART_Transmit(&huart2,buf1,8,0xff);
    modbus.recount=0;      
    sp3485_rx_enable;                //ÉèÖÃΪ½ÓÊÕģʽ    
}


void RS485_Receive_Buf(uint8_t *buf,uint16_t len)
{
    
    HAL_Delay(10);
    for(int i=0;i<modbus.recount;i++)
        {
            printf("Received byte: %02X\n", modbus.rcbuf[i]);
            buf[i]= modbus.rcbuf[i];    
        }        
    //HAL_UART_Receive(&huart2, buf, len, 0xff);
    
    for(int i=0; i<14; i++) 
    {
    printf("%02X ", buf[i]);
    }
    printf("\n");
    
    modbus.recount=0;        //ÇåÁã
    
}

这是中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//½ÓÊÕÍê³É»Øµ÷º¯Êý£¬µ±HAL_UART_Receive_IT½ÓÊÜÍê»á×Ô¶¯µ÷ÓÃÕâ¸öº¯Êý
{
    if (huart == &huart2)
    {

    
        if(modbus.recount<64)
        {
            modbus.rcbuf[modbus.recount]=RES;        //¼Ç¼½ÓÊÕµ½µÄÖµ
            modbus.recount++;                        //½ÓÊÕÊý¾ÝÔö¼Ó1 
            //printf("%02X",RES);
        } 
            //modbus.reflag = 1;
        // ÖØÐ¿ªÆôÖжÏ
            data_ready=1;
       HAL_UART_Receive_IT(&huart2, (uint8_t *)&RES, 1);
            
    }
        
}

希望大家能帮我看看这是为啥啊我收到的是图片中这样重复的

img

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-04-01 16:47
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题解答

    你遇到了一个问题:在读取485传感器的数据时,每个位都接收了两遍,这是main函数中的调用RS485_Send_Buf(TR_Read);HAL_Delay

    可能的原因是:

    1. 485传感器的数据传输方式是异步的,传输完成后,485传感器会发送一个ACK信号,表示数据传输完成。这个ACK信号可能会被误认为是新的数据,导致每个位都接收了两遍。
    2. 串口接收中断可能会在数据传输完成后,继续接收数据,导致每个位都接收了两遍。

    解决方案:

    1. 在读取数据时,添加一个判断,检查是否已经接收到了完整的数据,如果已经接收到了,直接返回,不再继续接收数据。
    2. 在串口接收中断中,添加一个判断,检查是否已经接收到了完整的数据,如果已经接收到了,直接返回,不再继续接收数据。
    3. 在485传感器的数据传输方式中,添加一个ACK信号,表示数据传输完成,避免误认为是新的数据。

    代码示例:

    void RS485_Send_Buf(uint8_t data) {
        // 发送数据
        HAL_UART_Transmit(&huart1, &data, 1, 100);
        // 等待ACK信号
        HAL_Delay(10);
        // 检查是否已经接收到了完整的数据
        if (uart1_rx_buffer[0] == data) {
            // 如果已经接收到了,直接返回
            return;
        }
        // 如果没有接收到完整的数据,继续接收数据
        while (uart1_rx_buffer[0] != data) {
            HAL_Delay(10);
        }
    }
    

    注意:上面的代码只是一个示例,实际情况可能需要根据具体的硬件和软件环境进行修改。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月1日