单片机实现环形队列_单片机模块化程序: 难道有环形队列串口发送数据就万事大吉了吗...
1.問個問題,下面程序有沒有BUG數(shù)組
2.環(huán)形隊列雖然解決了一開始的中斷發(fā)送數(shù)據(jù)覆蓋問題,可是呢卻引入了新的問題函數(shù)
3.而后看看中斷發(fā)送測試
4.想沒想明白是什么問題spa
5.發(fā)送數(shù)據(jù)1 和發(fā)送數(shù)據(jù)2 之間沒有延時......3d
咱作程序的時候常常碰到各個地方都須要發(fā)送串口的數(shù)據(jù),可是若是兩個發(fā)送函數(shù)一個先發(fā)送完,另外一個緊接著就發(fā)送了.......code
這時候就有問題了,發(fā)給一個設備,原本都是正確的數(shù)據(jù),可是因為這么一整,數(shù)據(jù)便成了錯的了.blog
好如今解決這個問題隊列
主要目的就是發(fā)送的數(shù)據(jù)還須要管理一下,讓發(fā)送的數(shù)據(jù)之間有時間間隔內(nèi)存
好,再加個環(huán)形隊列開發(fā)
這個環(huán)形隊列呢,記錄要發(fā)送的數(shù)據(jù)個數(shù)
如今就有兩個環(huán)形隊列,
一個環(huán)形隊列數(shù)存儲數(shù)據(jù),就是咱一開始用的
另外一個環(huán)形隊列是存儲此次要發(fā)送的數(shù)據(jù)個數(shù)
那么每次發(fā)送數(shù)據(jù)變?yōu)?/p>
而后中斷發(fā)送里面
Usart1ManageSendDatLen記錄的是此次發(fā)送的數(shù)據(jù)個數(shù)
發(fā)送的時候Usart1ManageSendDatLen -- , 變?yōu)?,就說明發(fā)完了如今的數(shù)據(jù)了
發(fā)送的數(shù)據(jù)個數(shù)是在定時器里面獲取
if(USART_GetITStatus(USART1, USART_IT_TXE) !=RESET)
{if(Usart1ManageSendDatLen>0 && rbCanRead(&Uart1rb)>0)//發(fā)送的數(shù)據(jù)個數(shù)大于0 ,環(huán)形隊列能夠讀出來數(shù)據(jù)
{
rbRead(&Uart1rb, &Usart1SendDat, 1);//讀取一個數(shù)據(jù)
USART_SendData(USART1, Usart1SendDat);//發(fā)送
Usart1ManageSendDatLen -- ;//發(fā)送的數(shù)據(jù)個數(shù)減一
}else{//發(fā)送字節(jié)結(jié)束
USART_ClearITPendingBit(USART1,USART_IT_TXE);
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
Usart1ManageSendDatLen= 0;//發(fā)送完成,清零
}
}//發(fā)送完成
if (USART_GetITStatus(USART1, USART_IT_TC) !=RESET)
{
USART_ClearITPendingBit(USART1,USART_IT_TC);
USART_ITConfig(USART1, USART_IT_TC, DISABLE);
}
定時器里面
Usart1ManageSendDatLen = 0;說明發(fā)送完數(shù)據(jù)了
而后 利用變量累加進行延時
延時10Ms(自行調(diào)節(jié),該變量控制兩條數(shù)據(jù)發(fā)送的時間間隔)
讀取下保存每次發(fā)送多少數(shù)據(jù)的那個環(huán)形隊列
取出來此次要發(fā)送的數(shù)據(jù)個數(shù)而后賦值給?Usart1ManageSendDatLen
而后打開發(fā)送中斷
發(fā)送中斷發(fā)送完數(shù)據(jù)又會出現(xiàn)?Usart1ManageSendDatLen = 0;
而后一直這樣工做
這樣的話,多條同時填充的數(shù)據(jù),發(fā)送每一條數(shù)據(jù)的時間間隔是10Ms
不會再出現(xiàn)整個發(fā)出去的狀況了!
if(Usart1ManageSendDatLen == 0)//沒有在發(fā)送數(shù)據(jù)
{
Usart1ManageSendDelayCnt++;if(Usart1ManageSendDelayCnt>=10)//延遲10Ms
{
Usart1ManageSendDelayCnt= 0;if(rbCanRead(&Uart1rbManage)>0)//是否是有須要發(fā)送的數(shù)據(jù)
{//取出此次要發(fā)送的數(shù)據(jù)個數(shù)
rbRead(&Uart1rbManage, &Usart1ManageSendDatLen, 1);
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//打開發(fā)送中斷
}else{//沒有數(shù)據(jù)發(fā)送的時候1Ms判斷一次,延遲1Ms
Usart1ManageSendDelayCnt=10;
}
}
}
測試
若是想測試的明顯
如今說下如今這個程序帶來的新問題
1.發(fā)送數(shù)據(jù)最低延遲 1Ms
其實這個延遲再加點變量就能夠解決,可是呢,我怕加多了,你們理解起來困難....
因此先這樣吧,有興趣本身去修改
2.無疑又增長了內(nèi)存開銷
3.這是是我最不肯意的事情
影響了printf一開始使用的中斷發(fā)送
由于一開始是不停的插入一個數(shù)據(jù),而后中斷發(fā)出去
如今不能夠這樣了,還須要想辦法呀
須要一次性獲得printf發(fā)送的內(nèi)容,而后填充到環(huán)形隊列里面.............
真很差搞的話,仍是用 sprintf 把,把數(shù)據(jù)序列化到一個數(shù)組里面,而后
發(fā)送的數(shù)據(jù)個數(shù) = sprintf(數(shù)組,XXXXXXX)
PutData(&Uart1rb,NULL,數(shù)組,發(fā)送的數(shù)據(jù)個數(shù));//數(shù)據(jù)寫入環(huán)形隊列
SendCount[0] = 發(fā)送的數(shù)據(jù)個數(shù);//此次發(fā)送的數(shù)據(jù)個數(shù)
PutData(&Uart1rbManage,NULL,SendCount,1);//數(shù)據(jù)寫入環(huán)形隊列,記錄此次要發(fā)送的數(shù)據(jù)個數(shù)
總結(jié)
以上是生活随笔為你收集整理的单片机实现环形队列_单片机模块化程序: 难道有环形队列串口发送数据就万事大吉了吗...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 合并 循环list_阿里巴
- 下一篇: 当我飞奔向你苏在在因为喝酒叫老公是第几集