您好!
我一直在使用 RFC_dataEntryPartial_t 来获取消息并在接收到部分数据包后设置数据包的长度字节。 当我使用示例中包含的 RFQueue.h 文件中提供的函数时、我会得到非常奇怪的结果、即数据包被错误地放置在 rxData 区域内。
我尝试在不使用 RFQueue.h 文件的情况下实现相同的缓冲区、并且成功了、我认为问题与 DataQueue 内各个缓冲区的对齐有关。
与我自己设置函数相比、使用 RFQueue 函数时是否缺少任何明显的东西?
共享定义
修改的 RFQueue 函数:
uint8_t
RFDefineQueueQueue (__attribute__((未使用)) dataQueue_t* DataQueue_p、uint8_t* buf_p、uint16_t BufLen、uint8_t NumEntry、uint16_t Length)
{
if (BufLen <(NumEntry *(Length + RF_queue_data_entry_header_size + RF_queue_queue_align_padding (Length)))){
/*队列不适合缓冲区*/
返回(1);
}
/* 4字节对齐需要填充? *
uint8_t 焊盘= 4 -(长度+ RF_queue_data_entry_header_size)% 4);
/*设置数据条目公共配置*/
uint8_t* FirstEntry_p = buf_p;
对于(int64_t Index = 0;Index < NumEntry;Index++){
buf_p = FirstEntry_p +(索引*(RF_queue_data_entry_header_size +长度+焊盘));
((RFC_DataEntry_t*)buf_p)->status = data_entry_pending;//挂起-启动状态
((RFC_DataEntry_t*) buf_p)->config.type = data_entry_type_partial;//对于 C/T 模式选择,data_entry_type_partial;
((RFC_DataEntry_t*)buf_p)->config.lenSz = 0;//数据中没有长度指示符字节
((RFC_DataEntry_t*) buf_p)->config.irqIntv = length_position;
((RFC_DataEntry_t*)buf_p)->length =长度;//数据字段的总长度
((RFC_dataEntryPartial_t*)buf_p)->pNextEntry =&(((RFC_dataEntryPartial_t*)buf_p)->rxData)+ Length + Pad;
}
/*将循环设置为最后。\n 下一页->第一页*/
((RFC_DataEntry_t*)buf_p)->pNextEntry = FirstEntry_p;
/*创建数据条目队列并配置循环缓冲区数据条目*/
DataQueue_p->pCurrent Entry = FirstEntry;
DataQueue_p->pLastEntry = NULL;
/*将读取指针设置为第一个条目*/
ReadEntry_p =(RFC_dataEntryPartial_t*) FirstEntry_p;
返回(0);
}
与我自己在代码中设置的数组相比:
静态 uint8_t rxDataEntryBuf0[rf_queue_data_entry_header_size + MAX_length + length_position + NUM_apped_bytes]__attribute_(aligned (4)));
静态 uint8_t rxDataEntryBuf1[rf_queue_data_entry_header_size + MAX_length + length_position + NUM_apped_bytes]__attribute_(aligned (4)));
RFC_dataEntryal_t* partialReadEntry0 =(RFC_dataEntryPartial_t*)&rxDataEntryBuf0;
RFC_dataEntryal_t* partialReadEntry1 =(RFC_dataEntryPartial_t*)&rxDataEntryBuf1;
RFC_dataEntryPartial_t* currentReadEntry =(RFC_dataEntryPartial_t*)&rxDataEntryBuf0;
partialReadEntry0->length = MAX_LENGTH + LENGTH_POSITION + NUM_SUBSTED_BYIES + 4;//确保在一个数据条目中有足够的空间容纳完整的数据包。
//此长度字段后面的字节数
//+ 4是为 pktStatus (2字节)和 nextIndex (2字节)腾出空间
partialReadEntry0->config.irqIntv = length_position;
partialReadEntry0->config.type = data_entry_type_partial;
partialReadEntry0->status = data_entry_pending;
partialReadEntry1->length = MAX_LENGTH + LENGTH_POSITION + NUM_SUBSTED_BYIES + 4;//确保在一个数据条目中有足够的空间容纳完整的数据包。
//此长度字段后面的字节数
//+ 4是为 pktStatus (2字节)和 nextIndex (2字节)腾出空间
partialReadEntry1->config.irqIntv = length_position;
partialReadEntry1->config.type = data_entry_type_partial;
partialReadEntry1->status = data_entry_pending;
partialReadEntry1->pNextEntry =(uint8_t*) partialReadEntry0;
partialReadEntry0->pNextEntry =(uint8_t*) partialReadEntry1;
dataQueue.pCurrent Entry=(uint8_t*) partialReadEntry0;
dataQueue.pLastEntry =空;