UART串口就像我的宠物,亲亲热热十几年了,一直很温顺。今天突然向我龇牙,被它吓出一身冷汗。
其实事件的起因很简单,算是我多事,本来没什么的。焊好一片新板,uPSD3251的,11.0592的晶体,带两个串口,想调试一下。就写了一段单片机的程序,在串口接收中断里面把收到的东东立刻发回去。
用PC机串口调试软件定时发出一个测试字符“a”,然后接收,Rx和Tx指示LED同时闪亮,接收正确。当我随手把测试字符改为“abcdefg”时,就出现乱码了,好像大约一秒出现一次(巧合,跟自动发送的定时时间有关)。
于是怀疑是不是没有伺候好看门狗,经测试,那条狗很尽职,从来不乱叫。
然后怀疑晶体的质量,换了晶体,也换了相应的电容,愁容依旧。
最后,修改程序,把收到的东东放到接收缓冲区,满了的时候,就转移到发送缓冲区发送,本本份份的、按部就班的处理接收和发送,问题就解决了。
其实,在接收中断里面随手把收到的东东发回去,只是为了测试一下通路,实际应用中没有人会这样做。但是,仅仅是测试的时候多发了几个字符,没想到就能积累起误差,引起这么大的麻烦。看来,还是功夫不到家啊。
后记:
51单片机只有接收缓冲没有发送缓冲,在上一个字节没有发送完成就写入下一个字节当然会出问题,与误差积累没有关系。PIC系列接收发送都有缓冲,就不会出现这种问题。
文章评论(0条评论)
登录后参与讨论