如果快速发送数据,PIC18F会锁定

时间:2010-11-13 23:24:37

标签: c pic

我正在使用PIC18F并尝试通过超级终端发送数据。当我每隔半秒按一个键以慢速发送数据时,它会接收数据并正确地回应它,但当我开始以更快的速度按键时,MCU会锁定。不确定是什么原因引起的。

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只是我们发送的调试代码,说“收到”。这就是我们知道什么时候冻结的原因。

每次都不会冻结相同数量的循环,它只取决于我们输入数据的速度。

3 个答案:

答案 0 :(得分:2)

(我确实在MCU工作,但没有与PIC达成协议,所以我会尝试帮助解决常见问题)

  1. 您不检查任何接收器错误标志。在您清除溢出标志之前,接收器可能会锁定在溢出错误状态并且不再接收。添加对错误条件的检查并根据PIC文档解决它们。

  2. 良好的做法是尽可能早地读取接收到的字节,并指示接收完成后,请尝试在rxData[index]= RCREG;之后立即移动while(PIR1bits.RCIF==0);。这降低了可能性

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

  4. 无动机的延迟表示你已经在某个地方出错了。尝试删除它,然后调试代码。

  5. 您应该单独测试您的接收和传输。首先,检查发射器:尝试通过UART输出长行文本,无需任何接收。 (说,写“Hello world!”程序:))

  6. 单独检查接收器代码:从程序中移除传输,连接LED(电压表,示波器,无论你有什么)以释放GPIO引脚,然后在每次接收到一个字节时使其切换到逻辑电平。它只需要几个时钟滴答,它不应该干预接收或锁定。

答案 1 :(得分:0)

也许当你在发送“收到”时发送2个字符时,其中一个字符会被丢弃而你永远无法联系到length

答案 2 :(得分:0)

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