現在小弟遇到了一個問題,利用串口3接到的資料每次只能接收8位,但是上位機發給我的是16位資料分開高8位和低8位,我用串口3的中斷服務函式怎么能把這兩個資料接收到呢,if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)還有這個有些小疑問,是不是第一個8位資料接收完后他就自動跳出這個中斷服務函式了呢,還是小白,謝謝大家解答
uj5u.com熱心網友回復:
void USART3_IRQHandler(void){
char recv_char;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
recv_char = USART_ReceiveData(USART3);
USART_ClearITPendingBit(USART3,USART_IT_RXNE);
USART_SendData(USART3,recv_char);
}
}
uj5u.com熱心網友回復:
/******************************************************************************** Function Name : USART3_IRQHandler
* Description : This function handles USART3 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void USART3_IRQHandler(void)
{
static short recv_data=https://bbs.csdn.net/topics/0,order=0;
if (USART_GetFlagStatus(USART3, USART_FLAG_ORE) != RESET)
{
USART_ReceiveData(USART3);
USART_ClearITPendingBit(USART3, USART_IT_ORE);//清除中斷標志
}
if(USART_GetITStatus(USART3, USART_IT_RXNE))//接收中斷
{
if(order==0){
recv_data=https://bbs.csdn.net/topics/USART_ReceiveData(USART3);
recv_data=https://bbs.csdn.net/topics/recv_data<<8;
order=1;
}
else{
recv_data+=USART_ReceiveData(USART3);
order=0;
recvComplete=1; //全域標志變數,表示16位資料收齊
}
USART_ClearITPendingBit(USART3,USART_IT_RXNE); //清除
}
}
uj5u.com熱心網友回復:
if (USART_GetFlagStatus(USART3, USART_FLAG_ORE) != RESET)
{
USART_ReceiveData(USART3);
USART_ClearITPendingBit(USART3, USART_IT_ORE);//清除中斷標志
}
你好感謝您的回復,這一塊沒太看明白,主要是什么作用啊
uj5u.com熱心網友回復:
用接收空閑中斷// 在頭檔案中宣告成C語言模式
// 接收完成
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) // 空閑中斷
{
//if(pUsartDMA)
// pUsartDMA->LumMod_Uart_DMA_Rx_Data();
USART_ReceiveData(USART1); // Clear IDLE interrupt flag bit
DMA_Cmd(DMA2_Stream5, DISABLE); // 關閉DMA ,防止干擾
DMA_ClearFlag(DMA2_Stream5, DMA_IT_TCIF5); // 清DMA標志位
//LumMod_Rx_Data.index = LUMMOD_RX_BSIZE - DMA_GetCurrDataCounter(LUMMOD_UART_Rx_DMA_Channel); //獲得接收到的位元組數
DMA2_Stream5->NDTR = 100; // 重新賦值計數值,必須大于等于最大可能接收到的資料幀數目
int i = 0;
for (; i < 8 && Uart_Rx[i] == Uart_Send_Buffer[i]; i++) {}
i == 8 ? pUsartDMA->num2++ : pUsartDMA->num3++;
for (int i = 0; i < 100; i++)
Uart_Rx[i] = 0;
DMA_Cmd(DMA2_Stream5, ENABLE);
pUsartDMA->num1 = 0;
// 自己發自己收時不能這么用
pUsartDMA->send(0, 0);
}
//DMA_Cmd(DMA2_Channel5, DISABLE);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/85853.html
標籤:單片機/工控
上一篇:求助,能幫忙看下哪里出問題了么,有n--的部分一直不行,但不知道為什么
下一篇:單片機求救
