久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1371|回復: 1
打印 上一主題 下一主題
收起左側

STM32 main()和中斷里沒有串口1的處理語句,但跟上位機的通訊正常

[復制鏈接]
跳轉到指定樓層
樓主
ID:305865 發表于 2019-6-28 14:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
新手咨詢個問題,一直困惑很久了,求解答。
板子是采用STM32L151,程序是前人寫的,其中有一功能塊是跟上位機或后臺485通訊,用的是UART1,通訊很正常。但我一直在困惑程序是怎么處理串口1的,因為在main()里除了串口1初始化語句外,沒有任何該串口的處理語句。在中斷部分里也是普通的串口發送接收語句。系統里也沒看到OS方面的語句(自己還沒學過OS這一塊,當時擔心是不是程序里加了OS),但uart1跟后臺通訊很正常,一直琢磨這程序是怎么運行的。我貼出具體程序,煩請幫忙分析一下。

在中斷stm32l1xx_it.c里有串口的處理語句:
void USART1_IRQHandler(void)
{
  App_UART1_Irq_Handle();
  App_UART1_Task();    //通信任務
}


在App_UART1_Irq_Handle()里,就是正常的串口接收和發送,要說復雜點就是用了隊列通訊方式,其他也沒看出有跳轉出去執行通訊處理部分。
void App_UART1_Irq_Handle(void)
{
  //接收中斷
  if(USART_GetITStatus(RS485_USARTX, USART_IT_RXNE) != RESET)
  {
    g_Com_Buff.com_Buff[g_Com_Buff.com_lenth] = Sub_Com_check_even(USART_ReceiveData(RS485_USARTX)); //接收數據并進行偶校驗
    g_Com_Buff.com_lenth++;
    //判斷長度超標處理
    if (g_Com_Buff.com_lenth > MAX_ADU_LENTH)
    {
      g_Com_Buff.com_lenth = 0;
    }
    //發送串口接收消息
    Queue_Insert(&Com_Queue ,COM_MSQ_IDLE_RX_ONE_BYTE);
    USART_ClearFlag(RS485_USARTX, USART_FLAG_RXNE);//清除中斷標志
  }

  //發送中斷
  if(USART_GetITStatus(RS485_USARTX, USART_IT_TXE) != RESET)
  {
    USART_SendData(RS485_USARTX, g_Com_Buff.com_Buff[current_send++]);
    if(current_send >= g_Com_Buff.com_lenth)
    {
      //等待最后一個數據送完
      while(USART_GetFlagStatus(RS485_USARTX, USART_FLAG_TC) == RESET);
      USART_ClearFlag(RS485_USARTX, USART_FLAG_TC);
      //關發送中斷
      Bsp_rs485_Tx_Int_Ctr(0);
      //current_send = 0;
      if(Queue_Insert(&Com_Queue ,COM_MSQ_RESPON_OK) != Q_OK)
      {
        Bsp_rs485_dir_Ctr(1);
        Bsp_rs485_Rx_Int_Ctr(1);
      }
    }
  }
}


在 App_UART1_Task();里
void App_UART1_Task(void)
{
    /*!< 消息數目變量*/
    d_uint8 qmsg_com_num = 0;

    /*!< 判斷消息隊列中是否有消息*/
    if (Queue_Query(&Com_Queue, &qmsg_com_num) == PAR_ERR)
    {
      /*!< 隊列出現致命錯誤*/
      App_Com_Task_Init();
      com_state = COM_IDLE;
      com_last_state = COM_IDLE;
      return;
    }
    /*!< 消息隊列中有消息*/
    while (qmsg_com_num > 0)
    {
      com_state = Com_Task_Table[com_last_state].pHandle();
      if (com_state != com_last_state)
      {
        Com_Task_Table[com_last_state].pExit();
        Com_Task_Table[com_state].pEnter();
        com_last_state = com_state;
      }

      /*!< 判斷消息隊列中是否有消息*/
      if (Queue_Query(&Com_Queue, &qmsg_com_num) == PAR_ERR)
      {
        /*!< 隊列出現致命錯誤*/
        App_Com_Task_Init();
        com_state = COM_IDLE;
        com_last_state = COM_IDLE;
        return;
      }        
    }
}


這一塊也沒有看出系統執行到這里,跳出去處理其他語句函數啥的。

煩請大家幫我分析一下,如果上位機發送數據過來,程序中斷跳轉到這兩個語句里,是怎么跳出去處理的?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:305865 發表于 2019-7-1 08:37 | 只看該作者
沒人啊?!!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品免费国产一区二区三区四区介绍 | 国产福利一区二区 | 日韩午夜 | 91九色porny首页最多播放 | 亚洲福利视频一区二区 | 涩涩导航| 91久久精品日日躁夜夜躁国产 | 亚洲一区二区视频 | 国产成人99久久亚洲综合精品 | 男人电影天堂 | 国产视频在线一区二区 | 国产一区二区影院 | 大陆一级毛片免费视频观看 | 久久精品国产久精国产 | 亚洲性网| 人人干人人爽 | 亚洲一区在线免费观看 | 99福利在线观看 | 久久99蜜桃综合影院免费观看 | 中文字幕第九页 | 亚洲精品中文字幕在线观看 | 久久国产综合 | 成人免费观看男女羞羞视频 | 九九九视频在线观看 | 精品亚洲一区二区三区 | 亚洲a在线观看 | 国产欧美在线一区二区 | 五月天综合影院 | 亚洲成人免费电影 | 99在线资源| av影片在线 | 在线看av网址| a视频在线观看 | 亚洲第一中文字幕 | 久久美女视频 | 99免费在线观看 | 亚州精品天堂中文字幕 | 欧美激情五月 | 久草中文在线 | 高清黄色 | 91毛片在线观看 |