完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我的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个回答
|
|
要实现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模式下单字节收发。 |
|
|
|
只有小组成员才能发言,加入小组>>
358 浏览 0 评论
1202 浏览 1 评论
590浏览 6评论
484浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
468浏览 5评论
467浏览 4评论
445浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-30 08:02 , Processed in 0.911067 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号