乐鑫技术交流
直播中

王英

7年用户 1330经验值
私信 关注
[问答]

求助,esp32在rs485模式下单字节收发怎么做?

我的esp32一端通过wifi与电脑通信,另一端通过uart串口通信。当由电脑通过wifi发送数据到esp32,esp32再通过uart串口RS485模式将数据发送出去。
我的wifi端接收数据代码如下:Code: Select all
void recv_data(void *pvParameters){        uint32_t recvLen = 0;        char *sendFromNetToUartBuff = (char *)malloc(NETRECEIVEBUFF);        while(1){                memset(sendFromNetToUartBuff, 0, NETRECEIVEBUFF);                if(currentParameters.sWiFiModule.sWiFiModSel.WiFiTransPcolFlag == TCPCLIENT || currentParameters.sWiFiModule.sWiFiModSel.WiFiTransPcolFlag == TCPSERVER){            recvLen = recv(connect_socket, sendFromNetToUartBuff, 1, 0);            if (recvLen > 0) {            } else {                show_socket_error_reason1("recv_data", connect_socket);                break;            }                }         else{                        ESP_LOGE(TAG, "WiFiTransPcolFlag configuration is invalid......");                        break;                }                uint8_t* newBuffer = (uint8_t*)malloc(recvLen+1);                memset(newBuffer, 0, (recvLen+1));                memcpy(newBuffer,sendFromNetToUartBuff,recvLen);                uartNetTransmitCapsule_t* capsule = malloc(sizeof(uartNetTransmitCapsule_t));                capsule->netRecvData = newBuffer;                capsule->bufferSize = recvLen;                ESP_LOGI(TAG, "Transmit.c: buffer is %sn", newBuffer);                if(!xQueueSend(queueToUart, capsule, 100/portTICK_RATE_MS)){                        xQueueReset(queueToUart);                        ESP_LOGE(TAG, "Failed to send net recv datas to uart recv task......");                        continue;                }                free(capsule);        }        ESP_LOGE(TAG, "Tcp recv data error......");        isNetRecvTaskErrorTrigger = true;        free(sendFromNetToUartBuff);        xEventGroupSetBits(rs485EventGroup, UDP_RS485_RS232_BIT);        vTaskDelete(NULL);}
uart口发送数据代码如下:Code: Select all
static void uartSendData(void *pvParameters){        uint32_t recvLen, delayTickTimes;        int netPacketTimes = 0;        recvFromNetToUartBuff = (uartNetTransmitCapsule_t*)malloc(UART_Q_ITEM_SIZE);        while(1){                if(!xQueueReceive(queueToUart, recvFromNetToUartBuff, portMAX_DELAY)){                        ESP_LOGE(TAG, "Failed to receive datas from net to uart......");                        continue;                }                if(currentParameters.sPort[0].uiTransitMode == RS485_2_wires){                        netPacketTimes++;                          comportCurrentTransmitMode = RS485_TX_MODE;                        uart_disable_intr_mask(EX_UART_NUM, UART_INTR_MASK);                                                recvLen = uart_write_bytes(EX_UART_NUM, (const char*) recvFromNetToUartBuff->netRecvData, 1);                        if(recvLen > 0){                                comportCurrentTransmitMode = RS485_RX_MODE;                                uart_flush(EX_UART_NUM);                                uart_enable_intr_mask(EX_UART_NUM, UART_INTR_MASK);                        }else{                                RS485TransmitToggle(RS485_RX_MODE);                                comportCurrentTransmitMode = RS485_RX_MODE;                                uart_flush(EX_UART_NUM);                                uart_enable_intr_mask(EX_UART_NUM, UART_INTR_MASK);                                free(recvFromNetToUartBuff->netRecvData);                                continue;                        }                }else{                        recvLen = uart_write_bytes(EX_UART_NUM, (const char*) recvFromNetToUartBuff->netRecvData, recvFromNetToUartBuff->bufferSize);                        if(recvLen > 0){                        }else{                                free(recvFromNetToUartBuff->netRecvData);                                continue;                        }                }                free(recvFromNetToUartBuff->netRecvData);        }        free(recvFromNetToUartBuff);        xSemaphoreGive(portManagerTaskSemaphore);        vTaskDelete(NULL);}
若我要一字节一字节的接收与发送,该如何改进呢?
感谢!!!

                             

回帖(1)

切克切克闹

2024-6-26 17:19:43
要实现ESP32在RS485模式下单字节收发,您需要按照以下步骤操作:

1. 初始化UART接口:首先,您需要初始化UART接口以使用RS485模式。您可以使用`uart_config_t`结构体来配置UART参数。

```c
uart_config_t uart_config = {
    .baud_rate = 9600, // 根据您的需求设置波特率
    .data_bits = UART_DATA_8_BITS,
    .parity = UART_PARITY_DISABLE,
    .stop_bits = UART_STOP_BITS_1,
    .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
    .source_clk = UART_SCLK_APB,
};
```

2. 配置RS485模式:接下来,您需要配置UART接口以使用RS485模式。您可以使用`uart_set_rs485_mode()`函数来实现这一点。

```c
uart_set_rs485_mode(UART_NUM_1, 1); // 将UART1配置为RS485模式
```

3. 初始化WiFi通信:根据您的代码,您已经实现了WiFi通信。确保您已经正确连接到WiFi网络并可以接收数据。

4. 接收WiFi数据:在`recv_data()`函数中,您已经实现了接收WiFi数据的逻辑。确保这部分代码可以正确接收数据。

5. 发送数据到UART:当您收到WiFi数据后,您需要将其发送到UART。您可以使用`uart_write_bytes()`函数来实现这一点。

```c
void send_data_to_uart(char *data, size_t length) {
    uart_write_bytes(UART_NUM_1, data, length);
}
```

6. 将接收到的WiFi数据发送到UART:在`recv_data()`函数中,当您接收到数据后,调用`send_data_to_uart()`函数将数据发送到UART。

```c
void recv_data(void *pvParameters) {
    // ... 省略其他代码 ...

    while (1) {
        // ... 省略其他代码 ...

        // 假设recvLen是接收到的数据长度
        if (recvLen > 0) {
            send_data_to_uart(sendFromNetToUartBuff, recvLen);
        }
    }
}
```

7. 接收UART数据:要接收UART数据,您可以使用`uart_read_bytes()`函数。您可以创建一个任务来处理接收到的数据。

```c
void uart_recv_task(void *pvParameters) {
    uint8_t recv_data[1]; // 接收单字节数据
    while (1) {
        if (uart_get_buffered_data_len(UART_NUM_1) > 0) {
            int len = uart_read_bytes(UART_NUM_1, recv_data, sizeof(recv_data), 0);
            if (len > 0) {
                // 处理接收到的数据
            }
        }
        vTaskDelay(10 / portTICK_PERIOD_MS);
    }
}
```

8. 创建并启动UART接收任务:在程序初始化时,创建并启动UART接收任务。

```c
void app_main() {
    // ... 省略其他代码 ...

    xTaskCreate(uart_recv_task, "uart_recv_task", 2048, NULL, 10, NULL);
}
```

通过以上步骤,您可以实现ESP32在RS485模式下单字节收发。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分