我正在使用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只是我们发送的调试代码,说“收到”。这就是我们知道什么时候冻结的原因。
每次都不会冻结相同数量的循环,它只取决于我们输入数据的速度。
答案 0 :(得分:2)
(我确实在MCU工作,但没有与PIC达成协议,所以我会尝试帮助解决常见问题)
您不检查任何接收器错误标志。在您清除溢出标志之前,接收器可能会锁定在溢出错误状态并且不再接收。添加对错误条件的检查并根据PIC文档解决它们。
良好的做法是尽可能早地读取接收到的字节,并指示接收完成后,请尝试在rxData[index]= RCREG;
之后立即移动while(PIR1bits.RCIF==0);
。这降低了可能性
您没有显示sendData的代码。可能会错过检查TX就绪状态和错误情况,因此它也可能会锁定。
无动机的延迟表示你已经在某个地方出错了。尝试删除它,然后调试代码。
您应该单独测试您的接收和传输。首先,检查发射器:尝试通过UART输出长行文本,无需任何接收。 (说,写“Hello world!”程序:))
单独检查接收器代码:从程序中移除传输,连接LED(电压表,示波器,无论你有什么)以释放GPIO引脚,然后在每次接收到一个字节时使其切换到逻辑电平。它只需要几个时钟滴答,它不应该干预接收或锁定。
答案 1 :(得分:0)
也许当你在发送“收到”时发送2个字符时,其中一个字符会被丢弃而你永远无法联系到length
?
答案 2 :(得分:0)
在大多数微控制器上,UART接收器溢出将导致新接收的字节被丢弃并且标志被置位,但接收器将继续正常工作。在PIC上,接收器溢出将导致UART死亡,直到CREN位清零并重新设置。