仅记录一下对ESP32函数库里
uart_enable_pattern_det_intr 和 uart_enable_pattern_det_baud_intr的理解。
因为网上很多学习资料要么过时要么互相抄不深究,导致错了也不知道而误导人。
首先,按照官方的说法 uart_enable_pattern_det_intr 已经不推荐使用了。
应该使用 uart_enable_pattern_det_baud_intr。
二者的区别是在超时设定上的时间单位不一样。
uart_enable_pattern_det_intr 的时间单位为硬件的APB时钟,ESP32是 (80Mhz)。
uart_enable_pattern_det_baud_intr的时间单位为用户配置的波特率周期。后面理解参数后会知道这样其实更好用。
esp_err_t uart_enable_pattern_det_baud_intr
(uart_port_t uart_num, char pattern_chr, uint8_t chr_num, int chr_tout, int post_idle, int pre_idle)
uart_num 串口号
pattern_chr 关键字符,可以是单个字符也可以是字符串比如 “+++”,下面也以它为例
chr_num 关键字的重复次数
chr_tout
关键字间隔时间,如果小于则不被认为是关键字。如果时间设置较大,比如大于一个字节时间则串口数据"+2+3+"也会被认为是关键字。这个时间设置成单字节周期就行,串口的话一个8位字节时间最少是8+2个周期,取10即可。有个别平台的是11个周期,停止位后多一个空闲周期。所以涉及到ESP32和单片机通讯的情况,一定要检查单片机的串口特性。
post_idle
关键字触发后的有效时间,如果小于则不认为是最后一个关键字。如果有++++,则认为有4个+,不是关键字,如果时间设置较大,那+++后设置时间内务必不能再出现+,否则会认为是4个++++导致不触发中断,即该时间也等效于+++出现后中断触发延时的时间,因为它要等超时后才能确认关键字是否满足要求。防止乱码干扰,这个可以取稍微大一点,,n*10,n取决你打算留多少字节时间的量。
pre_idle
关键字触发前的间隔时间,如果小于则不认为是第一个关键字。这可以保证消息里如果出现了关键字符不会错误的触发中断。因为消息里的字节都是紧挨着发送的。这个时间也要设置的大一点。也是n*10个周期,n取决于 。如果是简单系统,串口数据都是一口气完整发送完的。但像ESP32或者更复杂的安卓系统,不排除串口发送被打断一下的情况。
老函数的时间参数取值范围是24位,新的是16位。
老的函数是用硬件时间计时,需要你自己计算。新的函数用串口周期计时,方便用户。从函数原型看,新函数和老的基本一样,函数内部取了波特率和周期帮你算了而已。
关键字这个功能,其实更稳妥的做法应该是用头字+尾字+转移符这样的方式。但这个功能软件实现要比单片机寄存器配置实现容易些。寄存器配置就只能是简单对比,然后在时间上想办法以实现判断和排它。
所以这里关于超时的设置逻辑都是按照如何实现同样功能的角度去思考来的。毕竟我英语太烂,看了英文的注释也不确定是不是100%理解对了。
具体理解的对不对,还需要测试过才能最终确定。不过我大概率是没这个精力去做的,先把工作上的目的达到,之后看心情了。