为了降低读取数据出错的概率,将起始位的判断周期定为位宽的1/3,并在检测到起始位后,继续等待1/3位宽(再等待一个定时中断),对起始位进行确认(读取的值为0)。此时才认定是一个正常的起始位,将定时周期修改为正常的位宽。此后每个定时器中断可以正确读取1位的数据,且保证了读取的时机处在1/3~2/3位宽的中间部分,如图4所示。
此时,图3中出错的问题也得到解决,如图5所示。
此外,还解决了毛刺引起的起始位误判的问题。因为一个毛刺的持续时间不会延续1/3位宽的时间,否则该应用将因稳定性太差而不能得到实用。
4 硬件改进
除了单纯使用定时器实现外,还可以结合INT2中断实现起始位的确认,电路如图6所示。
此时,建议延后1/3或者1/2个位宽时间,再读取起始位的状态。若还是为低电平,则作为一个有效的起始位,关闭INT2中断,然后按照一个完整位宽的时问启动定时器,每次读取1位,完成接收1字节后,关闭定时器,开启INT2中断,启动下一个字节的接收流程。