2

我正在使用 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++;
}

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

这是我们的接收循环。sendData 只是我们发送说“已收到”的调试代码。这就是我们知道它何时冻结的方式。

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

4

3 回答 3

2

(我确实在 MCU 上工作,但没有处理 PIC,所以我会尝试帮助解决常见问题)

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

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

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

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

  5. 您应该分别测试您的接收和发送。首先,检查发送器:尝试通过UART输出长行文本,没有任何接收。(比如说,写“Hello world!”程序:))

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

于 2010-11-14T00:03:42.617 回答
0

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

于 2010-11-16T21:43:30.600 回答
0

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

于 2010-11-13T23:39:38.707 回答