仅记录一下对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个周期,停止位后多一个空闲周期。
post_idle
关键字触发后的有效时间,如果小于则不认为是最后一个关键字。如果有++++,则认为有4个+,不是关键字,如果时间设置较大,那+++后设置时间内务必不能再出现+,否则会认为是4个++++导致不触发中断,即该时间也等效于+++出现后中断触发延时的时间,因为它要等超时后才能确认关键字是否满足要求。防止乱码干扰,这个可以取稍微大一点,,n*10,n取决你打算留多少字节时间的量。
pre_idle
关键字触发前的间隔时间,如果小于则不认为是第一个关键字。这可以保证消息里如果出现了关键字符不会错误的触发中断。因为消息里的字节都是紧挨着发送的。这个时间也要设置的大一点。也是n*10个周期,n取决于 。如果是简单系统,串口数据都是一口气完整发送完的。但像ESP32或者更复杂的安卓系统,不排除串口发送被打断一下的情况。
老的时间参数是24位的,新的是16位。
老的函数是用硬件时间计时,需要你自己计算。新的函数用串口周期计时,方便用户。从函数原型看,新函数和老的基本一样,函数内部取了波特率和周期帮你算了而已。
这里关于超时的处理都是按程序逻辑思考来的,有一些还需要测试过才能最终确定。另外在别的地方看到有说 chr_num 的意思是关键字节的重复数量,这个应该不太靠谱。