完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
当我将草图切换到我的ESP8266时,uart_detect_baudrate(UART0) 返回 0。当我按下重置按钮时,它会给出正确的答案(在我的情况下为 9600)。如果我再次调用 uart_detect_baudrate(UART0),它将返回零。我需要一个强大的自动波特率检测器。我认为这可能与UART的初始化有关。但是,在调用函数之前,我尝试将 PULSE_NUM、PULSE_HIGH 和 PULSE_LOW 设置为零,但没有成功。你能帮忙吗?
unsigned long detectedBaudrate; while(millis() - start < 11000) { if(detectedBaudrate = uart_detect_baudrate(UART0)) break; yield(); delay(100); } Serial.println(detectedBaudrate); unsigned long detectedBaudrate; while(millis() - start < 11000) { if(detectedBaudrate = uart_detect_baudrate(UART0)) break; yield(); delay(100); } Serial.println(detectedBaudrate); uint32_t uart_detect_baudrate(int uart_nr) { uint32_t divisor = uart_baudrate_detect(uart_nr, 1); if(!divisor) return 0; uint32_t baudrate = UART_CLK_FREQ / divisor; uint32_t default_rates[] = {300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 74880, 115200, 230400, 256000, 460800, 921600, 1843200, 3686400}; size_t i; for(i = 1; i < sizeof(default_rates) / sizeof(default_rates[0]) - 1; i ) { if(baudrate <= default_rates[i]) { if(baudrate - default_rates[i - 1] < default_rates[i] - baudrate) i--; break; } } return default_rates[i]; } 伪造后打印零,硬重置后打印 9600 和 0。 |
|
相关推荐
1个回答
|
|
从您的描述来看,您希望在ESP8266上实现自动波特率检测,但在调用`uart_detect_baudrate(UART0)`函数时遇到了问题。以下是一些建议和解决方案:
1. 确保您的ESP8266已经正确初始化UART。在您的草图中,您需要添加以下代码来初始化UART: ```cpp void setup() { Serial.begin(9600); // 设置串口波特率为9600 // 其他初始化代码 } ``` 2. 在调用`uart_detect_baudrate(UART0)`函数之前,确保您的PULSE_NUM、PULSE_HIGH和PULSE_LOW变量已经正确设置。您可以尝试以下代码: ```cpp unsigned int PULSE_NUM = 0; unsigned int PULSE_HIGH = 0; unsigned int PULSE_LOW = 0; ``` 3. 修改您的代码,以便在调用`uart_detect_baudrate(UART0)`函数之前,先重置UART。这可以通过调用`Serial.end()`实现: ```cpp Serial.end(); // 重置UART ``` 4. 在重置UART之后,再次调用`Serial.begin(9600)`以重新初始化UART。 5. 现在,您可以调用`uart_detect_baudrate(UART0)`函数,并检查返回值。如果返回值为0,说明波特率检测失败。如果返回非零值,说明波特率检测成功。 以下是修改后的代码示例: ```cpp void setup() { Serial.begin(9600); // 初始化串口波特率为9600 unsigned long detectedBaudrate; unsigned long start = millis(); unsigned int PULSE_NUM = 0; unsigned int PULSE_HIGH = 0; unsigned int PULSE_LOW = 0; while (millis() - start < 11000) { Serial.end(); // 重置UART Serial.begin(9600); // 重新初始化UART detectedBaudrate = uart_detect_baudrate(UART0, PULSE_NUM, PULSE_HIGH, PULSE_LOW); if (detectedBaudrate != 0) { Serial.print("Detected baudrate: "); Serial.println(detectedBaudrate); break; } } } void loop() { // 其他代码 } ``` 希望这些建议能帮助您解决问题。如果仍然遇到问题,请随时告诉我。 |
|
|
|
只有小组成员才能发言,加入小组>>
486 浏览 1 评论
552浏览 6评论
461浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
443浏览 5评论
445浏览 4评论
415浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 17:21 , Processed in 0.758841 second(s), Total 83, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号