本帖最后由 taijing33 于 2020-8-11 09:46 编辑
我的串口2使用了高优先级中断,单片机连接 了串口屏。串口屏第一步设置一个数据时,后第二步马上切换到另一画面。这时单片机串口2会不进入中断。
如果第一步和第二部时间差在0.5秒以上,就不会有问题。第一步和第二步都是给单片机发两组数据,数组长度在15字节左右。快速操作的话。单片机的串口2就不接受数据了,仿真查看各种寄存器正常。
串口2的接受程序 如下:
void high_priority interrupt my_isr(void){
if(PIR3bits.RC2IF &&PIE3bits.RC2IE)
{
rdata = RCREG2;
if(Rx_en && RxCounter1 < USART1_R_LEN)
{
Usart1_rbuff[RxCounter1++] = rdata;
if(RxCounter1>=USART1_R_LEN)
Usart1_r_finish = 1;
Comdelay = 2; //20ms?????????????????
}
}
}
其中Comdelay 在定时中 累减。定时器10ms进入一次,20ms后如果Comdelay 为零。就认为一帧数据结束。然后Rx_en =0;关串口中断,终止接受新数据。并处理数据处理完后,打开串口中断并Rx_en =1;RxCounter1 = 0;
我这个程序 如果操作串口屏慢一点。一点问题没有。如果手速快的话,就会出现以上的问题。
*******************************
*******************************
*******************************
问题已经定位到 是 接受溢出导致。但是不知道为什么会溢出。
接受数组我定义的是100个字节。
#define USART1_R_LEN 100
u8 Usart1_rbuff[USART1_R_LEN]; //
我的串口屏每次操作顶多发给单片机15字节。我把数组改成200字节。照样溢出。
|