2010-11-13 19 views
2

我正在使用PIC18F,并试图通过超级终端发送数据。当我每半秒钟按一个键以慢速发送数据时,它会收到数据并正确回显,但当我以更快的速度开始按键时,MCU会锁定。不知道是什么原因造成的。如果快速发送数据,PIC18F锁定

while(index<length){ 
    while(PIR1bits.RCIF==0); // Wait till char recieved 
    sendData(str2,9); // confirm reception 

    Delay1KTCYx(5); //delay because without it, it messes up. 
    rxData[index]= RCREG; //char array 
    index++; 
} 

波特率是2400在PIC和超级终端上。

这是我们的接收循环。 sendData只是我们发送的“接收”调试代码。这是我们如何知道它何时冻结的。

它不会每次都以相同数量的循环冻结,而只是我们输入数据的速度有多快。

+0

你怎么知道PIC是锁定的?代码来自您的ISR?或者当你收到一个字节时你有额外的ISR吗? – AndreKR 2010-11-13 23:42:30

+2

这是在中断服务程序中?不要循环,不要发送,不要拖延。 – 2010-11-13 23:52:48

回答

2

(我做了MCU的工作,但还没有与太平洋岛国的交易,所以我会尽力帮助常见问题)

  1. 你不检查任何接收器错误标志。接收器可能会锁定在溢出错误状态,并且不会进一步接收,直到您清除溢出标志。添加检查错误条件并解决它们符合PIC文档。

  2. 好的做法是在接收完成时尽可能早地读取接收到的字节,因此请尽量在while(PIR1bits.RCIF==0);之后移动rxData[index]= RCREG;。这降低了可能性

  3. 您没有显示sendData的代码。可能会错过检查TX就绪状态和错误情况,所以它也可能锁定。

  4. 无心的延迟表明你已经在某处出错了。尝试删除它,然后调试代码。

  5. 你应该测试你的接收和分开发送。首先,检查发送器:尝试通过UART输出长文本而不接收。 (说,写“Hello world!”程序:))

  6. 单独检查接收代码:从程序中删除传输,连接LED(电压表,示波器,无论你有什么)来释放GPIO引脚,然后使其切换逻辑每当它接收到一个字节时,它就会在它上面。是否只需要几个时钟周期来做,它不应该干预接收或锁定。

0

也许当您在发送2个字符的同时发送“收到”其中一个被丢弃,并且您永远不会到达您的length

0

在大多数微控制器上,UART接收器溢出将导致新接收的字节被丢弃并且标志被置位,但接收器将继续正常工作。在PIC上,接收器溢出会导致UART死机,直到CREN位被清零并重新置位。