刚下我需要下载来学习学习~ |
这问题最终也解决了,原来要把S2TI清除是可以直接用ANL指令的,只要一个指令: ANL S2CON, #11111101B ;CLEAR S2TI BIT 而不必先载入ACC, ANL之后再送回(三个指令): MOV A, S2CON ;READ UART2 CONTROL REGISTER AGAIN ANL S2CON, #11111101B ;CLEAR S2TI BIT MOV S2CON, A 又长知识了,实践是迈向正确的最好办法哈,现在那怕晶振频率到了33M,115200BPS, 疲劳试验几小时也不出错了。 谢谢各位前辈的指导。 |
yaoji123 发表于 2019-2-8 14:55 这个问题我也很困扰,后来也想通了,说明书上都说中断发生后,不会被同级的中断级别所打断,但没有强调这个后来的中断是会被记住的,等当前的中断结束后,就会被执行,所以这里有网友在劝告我们初哥不要在中断程序里搞太多事,把资料移走后就赶快离开,因为在当前的中断程序里呆太久,在那里等待处理的中断又再产生同样的中断,就会遗失一个中断,结果就是死机啦。 |
dzbj 发表于 2019-2-8 22:55 我也是一直用官网上的范例来用uart2,也没问题,就是不满足把一个BYTE放进SBUF后还要在那等发送完毕产生TI置位才可以走,那段时间全浪费了,这样怎能做出高效的设计。这里网友提供的四个UART同时收发的例子才是正道,所以我开始造一个用STC8AXXXS4的板子来实验。有了四个UART,如果同时收发效果不尽人意,就可以把收和发各自分配给不同的UART,避免意外死机。 |
手头还没有STC8A的开发板,春节过后会买一个来试,我还没有学C,但通过自己写的程序,竟然也看懂C了,逻辑与我的汇编差不多,S2,S3,S4CON都不能位操作,所以都必须先读进A进行and操作再存回,这期间如果刚好传送完毕而SxTI置位,就会被写回的SxCON覆盖,无法产生中断,因此SxBUSY位无法复位,这是我对这一问题的猜想,我今晚把uart1的RI和TI的重置方式改用与UART2的方式,就是读入,AND,再写回三部曲,结果问题就在UART1重现了,也许STC8有对UART进行一些改进也说不定。等试过就知。 |
再看看程序吧 我也用12c做了个东西 串口2和串口屏通讯 速率也是115200 一直没事 用的就是官网给的范例 |
我给你来个程序试试 STC8A8K64S4A12 单片机的一个4串口同时中断收发的程序,4个全双工串口工作于不同的波特率,115200,57600,38400,19200,然后你可以接4台电脑的串口助手,同时测试,程序会数据原样返回,你可以每个串口测试1M字节看看,没有问题的。
|
17.15 KB, 下载次数: 22
我曾经用15系列的同时开定时器0、1,ADC、串口1、3的中断。结果串口3,两个字节之间延时达到毫秒才能无漏掉地接收,估计是中断优先级太低的问题。 |
串口通讯口2的中断优级较低,这一点要注意。 |