在緩沖陣列里讀寫正常,資料可以正常寫入RINGBUFFER,也可以正常從RINGBUFFER讀出,哪位大神可以給一點找到錯誤的思路,感激不盡,已經糾結了三天了。
uj5u.com熱心網友回復:
我的程式主要是,定時器定時,每30S向傳感器問詢讀數,我在資料接收的地方加入了RINGBUFFER(回圈緩沖陣列)之后進入定時中斷,程式就會卡住。我的資料可以正常寫入陣列,也可以正常從回圈緩沖陣列中讀出。RINGBUFFER主要參考的是機智云的代碼;************************************************************
* @file ringbuffer.c
* @brief Loop buffer processing
* @Author Gizwits
* @date 2017-07-19
* @version V03030000
* @copyright Gizwits
*
* @note Gizwits is only for smart hardware
* Gizwits Smart Cloud for Smart Products
* Links | Value Added | Open | Neutral | Safety | Own | Free | Ecology
* www.gizwits.com
*
***********************************************************/
#include "ringBuffer.h"
#include "common.h"
rb_t DataRecievce;
uint8_t rbBuf[18];
/**********
創建環形緩沖區的函式
********************/
void RingbufferInit(void)
{
DataRecievce.rbCapacity =18;
DataRecievce.rbBuff = rbBuf;
if(0==rbCreate(&DataRecievce))
{
printf ("rbCreate success\n");
}
}
int8_t ICACHE_FLASH_ATTR rbCreate(rb_t* rb)
{
if(NULL == rb)
{
return -1;
}
rb->rbHead = rb->rbBuff;
rb->rbTail = rb->rbBuff;
return 0;
}
/*******
環形緩沖區洗掉函式
**********/
int8_t ICACHE_FLASH_ATTR rbDelete(rb_t* rb)
{
if(NULL == rb)
{
return -1;
}
rb->rbBuff = NULL;
rb->rbHead = NULL;
rb->rbTail = NULL;
rb->rbCapacity = 0;
return 0;
}
/****
獲取環形緩沖區的容量
****/
int32_t ICACHE_FLASH_ATTR rbCapacity(rb_t *rb)
{
if(NULL == rb)
{
return -1;
}
return rb->rbCapacity;
}
/*******
*******/
int32_t ICACHE_FLASH_ATTR rbCanRead(rb_t *rb)
{
if(NULL == rb)
{
return -1;
}
if (rb->rbHead == rb->rbTail)
{
return 0;
}
if (rb->rbHead < rb->rbTail)
{
return rb->rbTail - rb->rbHead;
}
return rbCapacity(rb) - (rb->rbHead - rb->rbTail);
}
int32_t ICACHE_FLASH_ATTR rbCanWrite(rb_t *rb)
{
if(NULL == rb)
{
return -1;
}
return rbCapacity(rb) - rbCanRead(rb);
}
int32_t ICACHE_FLASH_ATTR rbRead(rb_t *rb, void *data, size_t count)
{
int32_t copySz = 0;
if(NULL == rb)
{
return 16;
}
if(NULL == data)
{
return 8;
}
if (rb->rbHead <= rb->rbTail)
{
copySz = min(count, rbCanRead(rb));
memcpy(data, rb->rbHead, copySz);
rb->rbHead += copySz;
return copySz;
}
else
{
if (count < rbCapacity(rb)-(rb->rbHead - rb->rbBuff))
{
copySz = count;
memcpy(data, rb->rbHead, copySz);
rb->rbHead += copySz;
return copySz;
}
else
{
copySz = rbCapacity(rb) - (rb->rbHead - rb->rbBuff);
memcpy(data, rb->rbHead, copySz);
rb->rbHead = rb->rbBuff;
copySz += rbRead(rb, (char*)data+copySz, count-copySz);
return copySz;
}
}
}
//將一定長度的資料(count)從某段地址(data)寫入環形緩沖區
int32_t ICACHE_FLASH_ATTR rbWrite(rb_t *rb, const void *data, size_t count)
{
int32_t tailAvailSz = 0;
if((NULL == rb)||(NULL == data))
{
return -1;
}
if (count >= rbCanWrite(rb))
{
return -2;
}
if (rb->rbHead <= rb->rbTail)
{
tailAvailSz = rbCapacity(rb) - (rb->rbTail - rb->rbBuff); //本次可寫入的數量=環形陣列容量—(尾指標地址-環形陣列首地址)
if (count <= tailAvailSz)
{
memcpy(rb->rbTail, data, count);
rb->rbTail += count;
if (rb->rbTail == rb->rbBuff+rbCapacity(rb))
{
rb->rbTail = rb->rbBuff;
}
return count;
}
else
{
memcpy(rb->rbTail, data, tailAvailSz);
rb->rbTail = rb->rbBuff;
return tailAvailSz + rbWrite(rb, (char*)data+tailAvailSz, count-tailAvailSz);
}
}
else
{
memcpy(rb->rbTail, data, count);
rb->rbTail += count;
return count;
}
}
以上是機智云中的RINGBUFFER代碼
下面是我向傳感器問詢及接收應答的代碼(部分)
//串口2中斷服務程式
void USART2_IRQHandler(void)
{
if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE)!=RESET))
{
uart2_buff[uart2_p++] =USART2->DR;//存入陣列
}
if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)!=RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
rbWrite(&DataRecievce,uart2_buff,uart2_p); //寫入回圈緩沖數列
}
}
void getWinddirectionData()
{
AskCmd((u8 *)WinddirectionAsk);
DELAY;
u8 *redata;
//printf("緩沖區可讀1:");
//printf("%d",rbCanRead(&DataRecievce));
rbRead(&DataRecievce,redata,7); //從緩沖陣列中讀出資料
if(crcCheck(redata,7)==1)
{
SensorData.winddirection = (redata[3]<<8 | redata[4] ); //這里我是要保存到結構體中,進行打包,形成報文上傳(不會有錯誤)
//rbDelete(&DataRecievce);
//printf("緩沖區可讀0:");
//printf("%d",rbCanRead(&DataRecievce));
}
clean_rebuff2();
}
思路大概就是這樣,如果不加緩沖陣列沒有錯誤,程式我們也用了很久了;
最近剛了解緩沖陣列,想嘗試添加,但是程式總是在定時器中斷中卡住;
主要是,找不到錯誤的地方,大神也可以提供一下找錯誤的思路,謝謝;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/143186.html
標籤:單片機/工控
