1.問個問題,下面程序有沒有BUG數組
2.環形隊列雖然解決了一開始的中斷髮送數據覆蓋問題,可是呢卻引入了新的問題函數
3.而後看看中斷髮送測試
4.想沒想明白是什麼問題spa
5.發送數據1 和發送數據2 之間沒有延時......3d
咱作程序的時候常常碰到各個地方都須要發送串口的數據,可是若是兩個發送函數一個先發送完,另外一個緊接着就發送了.......code
這時候就有問題了,發給一個設備,原本都是正確的數據,可是因爲這麼一整,數據便成了錯的了.blog
好如今解決這個問題隊列
主要目的就是發送的數據還須要管理一下,讓發送的數據之間有時間間隔內存
好,再加個環形隊列開發
這個環形隊列呢,記錄要發送的數據個數
如今就有兩個環形隊列,
一個環形隊列數存儲數據,就是咱一開始用的
另外一個環形隊列是存儲此次要發送的數據個數
那麼每次發送數據變爲
而後中斷髮送裏面
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);//數據寫入環形隊列,記錄此次要發送的數據個數