最近做ESP32采集modbus设备上数据在大彩串口屏上显示,因为有几个页面要显示的数据很多,同时又有按键,中文文本等,要求刷新要快,要不然影响客户体验。
问题一
刚开始esp32上用的485口结果就是按键和客户输入的文本有丢失,后来才想起485是半双工的,大量数据密集往串口屏发送,结果就是串口屏发送出来的数据esp32实际收不到,或者偶尔收到。后面改接口为232,之前画板的时候不用232,主要是以前用廉价的max232经常损坏,不太敢使用。网上买了一些便宜的几块的232模块,竟然通信不了,能收发,但莫名一会就会发热惊人,通信不上,后来再买十几块那种232模块,一换就正常。换到232,串口全双工工作了,既可以密集更新控件数据,又可以响应屏幕输入的数据。
问题二
屏幕显示由于有正常刷新的传感器数据,有一些中文的信息,还有大量的配置数据等待用户输入,刚开始大概率会在一些控件出现乱码,中英文下都一样,发送数据的地方加了延时不会很常出现,但也会出现,这样肯定不行,一影响体验,二出现乱码(老板说会让人认为我们不专业)。由于系统是esp32+freertos,各种信息是在不同线程上用同一个串口发送数据,这样就很又可能一个线程没发送完成另一个线程又发送了。而且发送的buf不是队列那种,需要发送的时候往buf里写数据,然后调用esp32的发送api。其实这种一开始就应该采用互斥的做法对串口发送加锁。同一个硬件(比如UART、I2C等)被多个任务访问的情况比较多,如果不合理处理,就会导致“混乱”的局面。最后给串口加锁,测试过程基本没怎么看过乱码的现象出现。
参考:
链接: link