我也碰到了啊 . MODBUS RTU的模式. 運行不了10分鐘必死機.... 太怪了.
我的代碼如下 , 不管有沒有加入溢位處理 都會死機.... 求解 !!!
void USART2_IRQHandler(void) //串口2中斷服務程序(modbus master)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) ==SET) //接收中斷
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
if(USART_GetFlagStatus(USART2,USART_FLAG_PE)==RESET) //檢查奇偶校驗是否錯誤
{
receBuf2[receCount2]= USART_ReceiveData(USART2);
if (!(receBuf2[receCount2]==0 && receCount2==0)) // 丟棄第1個收到的無效字元
{
receCount2++; //接收地址偏移寄存器加1
Timer2_enable(); //每接收到一個字元後, 觸發內部定時中段2
}
}
}
// if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET) // 溢出處理
// {
// USART_ClearFlag(USART2,USART_FLAG_ORE); //讀SR其實就是清除標志
// USART_ReceiveData(USART2); //讀DR
// }
if(USART_GetITStatus(USART2,USART_IT_TC) == SET) // 傳輸完成時中段
{
USART_ITConfig(USART2,USART_IT_RXNE,DISABLE); // 發送時先關閉接收中段
USART_ClearFlag(USART2,USART_FLAG_TC); //注意這個地方的寫法,stm32串口發送中斷的寫法,要清零標誌位
if(sendPosi2 < sendCount2)
{
sendPosi2++;
USART_SendData(USART2,sendBuf2[sendPosi2]); // 發送資料
}
else
{
receCount2 = 0; //清接收地址偏移寄存器//
checkoutError2 = 0;
receEnable2(); //發送完後將485置於接收狀態
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); // 允許接收中段
}
}
} |