完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我用ESP NOW 开发一个无线串口穿透程序,将收到的ESP_NOW报文发送到串口,同时将串口收到的消息通过ESP NOW 发出。希望能实现串口的串流
使用ARDUINO IDE 进行的开发。 但是串口串流中间总是会中断,在 ESP NOW onRecive 里面将数据写到 TX fifo 中,在loop 中将rx 的数据通过ESP NOW 转发出去 串口转发的速率为600bit/s ,串口接收的速率也为600bit/s,理论上串口波特率已经远低于 ESP NOW onRecive 中填充 TX fifo 的速率了,应该不会停止 我发现串口的 TX RX fifo 是通过同一个 MUTEX 管理的,不知道这个MUTEX 会不会影响同一个串口的 收和发行为。 下面是代码 ┭┮﹏┭┮ Code: Select all #include #include #include #include //#define DEBUG #define RX_BOARD //#define BLINK_ON_RECV #define WIFI_CHANNEL 1 #define BAUD_RATE 600 #define BUFFER_SIZE 250 // max of 250 bytes #define mSerial Serial // TX 44:17:93:F9:52:34 // RX 44:17:93:F9:2E:C4 #ifdef RX_BOARD const uint8_t broadcastAddress[] = {0x44, 0x17, 0x93, 0xF9, 0x52, 0x34}; #else const uint8_t broadcastAddress[] = {0x44, 0x17, 0x93, 0xF9, 0x2E, 0xC4}; #endif const uint32_t timeout_micros = (int)(1.0 / BAUD_RATE * 1E6); uint8_t buf_recv[BUFFER_SIZE]; uint8_t buf_send[BUFFER_SIZE]; uint8_t buf_size = 0; void OnDataRecv(const uint8_t *mac, const uint8_t *incomingData, int len) { #ifdef BLINK_ON_RECV digitalWrite(LED_BUILTIN, HIGH); #endif //memcpy(&buf_recv, incomingData, len); mSerial.write(incomingData, len); #ifdef BLINK_ON_RECV digitalWrite(LED_BUILTIN, LOW); #endif #ifdef DEBUG mSerial.print("n Bytes received: "); mSerial.println(len); #endif } void setup() { //设置led 指示灯 pinMode(LED_BUILTIN, OUTPUT); //设置波特率 mSerial.begin(BAUD_RATE); mSerial.setRxBufferSize(50000); Serial.begin(BAUD_RATE); pinMode(16, INPUT_PULLUP); pinMode(17, OUTPUT); WiFi.mode(WIFI_STA); #ifdef DEBUG mSerial.println(); mSerial.println(WiFi.macAddress()); #endif // ESP_NOW 初始化 if (esp_wifi_set_channel(WIFI_CHANNEL, WIFI_SECOND_CHAN_NONE) != ESP_OK) { mSerial.println("Error changing wifi channel"); return; } if (esp_now_init() != ESP_OK) { mSerial.println("Error initializing ESP_NOW"); return; } //添加peer esp_now_peer_info_t peerInfo; memcpy(peerInfo.peer_addr, broadcastAddress, 6); peerInfo.channel = WIFI_CHANNEL; peerInfo.encrypt = false; if (esp_now_add_peer(&peerInfo) != ESP_OK) { mSerial.println("failed to add peer"); } esp_now_register_recv_cb(OnDataRecv); } uint64_t start; void loop() { // put your main code here, to run repeatedly: // read up to BUFFER_SIZE from mSerial port if (mSerial.available()) { start = micros(); while (mSerial.available() && buf_size < BUFFER_SIZE) { buf_send[buf_size] = mSerial.read(); buf_size++; if (micros() - start > timeout_micros) goto WRITE; } } // send buffer contents when full or timeout has elapsed if (buf_size > 0) { WRITE: #ifdef BLINK_ON_SEND digitalWrite(LED_BUILTIN, HIGH); #endif // #ifdef RX_BOARD // Serial.write(buf_send, buf_size); // #endif esp_now_send(broadcastAddress, (uint8_t *)&buf_send, buf_size); buf_size = 0; #ifdef DEBUG if (result == ESP_OK) { mSerial.println("Sent!"); } else { mSerial.println("Send error"); } #endif #ifdef BLINK_ON_SEND digitalWrite(LED_BUILTIN, LOW); #endif } } |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
461 浏览 0 评论
982 浏览 0 评论
1702 浏览 0 评论
请问一下我想用ESP8685直接替换ESP8266而不用写程序,可以让ESP8685直接通过之前ESP8266的外挂的flash运行程序吗
1358 浏览 1 评论
1249 浏览 1 评论
为blufi_device设置自定义名称,但是无法修改,为什么?
1274浏览 4评论
请问ESP32-S2-WROOM怎么获得ESP32-S2外接FLASH的唯一序列号?
942浏览 3评论
2372浏览 3评论
ESP-IDF的VScode插件的build按钮点击会报错的原因?
2560浏览 3评论
ESP-Jumpstart例程中第5个工程:5_cloud连接报错是哪里的问题?
1067浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-10 10:52 , Processed in 0.900578 second(s), Total 69, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
570
