單片機模塊化程序: 難道有環形隊列串口發送數據就萬事大吉了嗎


 

 

 

1.問個問題,下面程序有沒有BUG

 

 

 

 

 2.環形隊列雖然解決了一開始的中斷發送數據覆蓋問題,但是呢卻引入了新的問題

 

3.然后看看中斷發送

 

 

 

4.想沒想明白是什么問題

 

 

 5.發送數據1 和發送數據2 之間沒有延時......

咱做程序的時候經常碰到各個地方都需要發送串口的數據,但是如果兩個發送函數一個先發送完,另一個緊接着就發送了.......

這時候就有問題了,發給一個設備,本來都是正確的數據,但是由於這么一整,數據便成了錯的了.

 

好現在解決這個問題

主要目的就是發送的數據還需要管理一下,讓發送的數據之間有時間間隔

好,再加個環形隊列

這個環形隊列呢,記錄要發送的數據個數

 

現在就有兩個環形隊列,

一個環形隊列數存儲數據,就是咱一開始用的

另一個環形隊列是存儲這次要發送的數據個數

 

那么每次發送數據變為

 

 

 

然后中斷發送里面

Usart1ManageSendDatLen記錄的是這次發送的數據個數

發送的時候Usart1ManageSendDatLen -- , 變為0,就說明發完了現在的數據了

發送的數據個數是在定時器里面獲取

 

 

 

    if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
  {        
    if(Usart1ManageSendDatLen>0 && rbCanRead(&Uart1rb)>0)//發送的數據個數大於0 ,環形隊列可以讀出來數據
    {
      rbRead(&Uart1rb, &Usart1SendDat, 1);//讀取一個數據
      USART_SendData(USART1, Usart1SendDat);//發送
            Usart1ManageSendDatLen -- ;//發送的數據個數減一
    }
    else
    {
      //發送字節結束
      USART_ClearITPendingBit(USART1,USART_IT_TXE);
      USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
      USART_ITConfig(USART1, USART_IT_TC, ENABLE);
            Usart1ManageSendDatLen = 0;//發送完成,清零
    }
  }
  //發送完成
  if (USART_GetITStatus(USART1, USART_IT_TC) != RESET)
  {
    USART_ClearITPendingBit(USART1,USART_IT_TC);
    USART_ITConfig(USART1, USART_IT_TC, DISABLE);
  }

 

 

 

 

 

 

 

定時器里面

 

Usart1ManageSendDatLen = 0;說明發送完數據了

然后 利用變量累加進行延時

延時10Ms(自行調節,該變量控制兩條數據發送的時間間隔)

讀取下保存每次發送多少數據的那個環形隊列

取出來這次要發送的數據個數然后賦值給 Usart1ManageSendDatLen 

然后打開發送中斷

發送中斷發送完數據又會出現 Usart1ManageSendDatLen = 0;

然后一直這樣工作

這樣的話,多條同時填充的數據,發送每一條數據的時間間隔是10Ms

不會再出現整個發出去的情況了!

 

 

 

 

 

    if(Usart1ManageSendDatLen == 0)//沒有在發送數據
    {
        Usart1ManageSendDelayCnt++;
        if(Usart1ManageSendDelayCnt>=10)//延遲10Ms
        {
            Usart1ManageSendDelayCnt = 0;
            if(rbCanRead(&Uart1rbManage)>0)//是不是有需要發送的數據
            {
                //取出這次要發送的數據個數
                rbRead(&Uart1rbManage, &Usart1ManageSendDatLen, 1);
                USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//打開發送中斷
            }
            else
            {
                //沒有數據發送的時候1Ms判斷一次,延遲1Ms
              Usart1ManageSendDelayCnt=10;
            }
        }
    }

 

 

測試

如果想測試的明顯

 

 

 

 

 

 

 

現在說下現在這個程序帶來的新問題

1.發送數據最低延遲 1Ms

  其實這個延遲再加點變量就可以解決,但是呢,我怕加多了,大家理解起來困難....

  所以先這樣吧,有興趣自己去修改

 

 

 

 

 

 

2.無疑又增加了內存開銷

 

 

 

 

 

 

 

 

3.這是是我最不願意的事情

  影響了printf一開始使用的中斷發送

  因為一開始是不停的插入一個數據,然后中斷發出去

  現在不可以這樣了,還需要想辦法呀

  需要一次性得到printf發送的內容,然后填充到環形隊列里面.............

  真不好搞的話,還是用 sprintf 把,把數據序列化到一個數組里面,然后

  發送的數據個數 = sprintf(數組,XXXXXXX)

  PutData(&Uart1rb,NULL,數組,發送的數據個數);//數據寫入環形隊列
  SendCount[0] = 發送的數據個數;//這次發送的數據個數
  PutData(&Uart1rbManage,NULL,SendCount,1);//數據寫入環形隊列,記錄這次要發送的數據個數

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM