ESP32多核心运行任务时共享变量无法正常更新问题咨询
问题根因
你的问题和多核心同步、volatile关键字或者原子操作都没有关系,错误出在串口处理逻辑上:
Serial.available()返回的是串口接收缓冲区中未读取的字节数,你只调用了Serial.flush(),这个函数在ESP32 Arduino框架中的作用是等待串口发送缓冲区数据发送完成,对接收缓冲区没有任何清理作用- 你输入
xxx后,接收缓冲区的3个字节一直没有被读取,Serial.available()永远返回非0值,每次loop循环都会执行getAllData = true的赋值操作,就算采集任务把变量改为false,下一次loop执行又会把变量覆盖回true,才会出现变量一直为1的现象。
修复方案
把串口处理部分的逻辑改为读取清空接收缓冲区即可:
void loop() { if (Serial.available()) { // 读取所有接收缓冲区的内容,清空缓冲区 while(Serial.available()) { Serial.read(); } getAllData = true; } Serial.print("From loop: "); Serial.println(getAllData); if (dataReadyToSend) { dataReadyToSend = false; } delay(1000); }
修改后你原本的volatile版本代码就可以正常运行,不需要额外引入原子变量。如果要保留原子变量的实现,同样只需要修改串口处理部分的逻辑即可。
内容的提问来源于stack exchange,提问作者SKGadi
相关产品推荐
相关产品推荐

