大意了!
读取wk2124 FIFO缓冲区
/*===================================================================================
功能:读取wk2124子串口的FIFO的数据
*port: 1~12,表示串口的标号(该串口标号由1个wk2124芯片片选将1个spi接口转换为12个串口)
*buf:用于接受数据的缓冲区
*len:要接受的数据长度(最大长度为FIFO中已经存在的数据长度)
*返回:所读取的子串口数据长度
*备注:gwh
====================================================================================*/
uint16_t WK_PortRecvData(uint8_t port, void *buf, uint16_t len)
{
uint8_t state = 0;
uint8_t nread = 0;
WK_CS_handler(port); // 片选三个wk2124中的一个
port = port % 4;
if (port == 0)
{
port = 4;
}
state = WK_ReadSReg(port, WK2XXX_FSR); // 读wk2124的子串口FIFO状态寄存器
if (state & WK2XXX_RDAT) // 接收FIFO非空
{
nread = WK_ReadSReg(port, WK2XXX_RFCNT); // 查询FIFO中的数据量
nread = (len >= nread ? nread : len);
WK_ReadFIFO(port, buf, nread); // 读取FIFO中的数据
}
return nread; // 返回实际读取到的数据长度
}测试读取的代码
void Test(void)
{
uint8_t receive_len = 0; // 每次接收到的数据长度
uint8_t buf[50]; // 数据缓冲区
while(1){
receive_len = WK_PortRecvData(uart_uid, buf, 50);
if(receive_len!=0 ){
/* 你的代码 */
buf[3] = '1'; // 例如说,希望这个下标3的数据被替换为 字符 1
HAL_UART_Transmit(&huart2,buf,receive_len ,0xffff);
}
}
}正常是直接调用这个函数,即可接收数据,但是在使用的时候要注意一个问题,那就是这个是通过cpu直接对FIFO进行数据读取,只要缓冲区里有数据,就会读取(cpu运行的很快),由于cpu比较快,导致几乎就是1个字节1个字节的接收数据,(原先我以为是读一次就直接读取了全部的内容,实际上,并没有),导致我在代码中修改一个地址的值的时候,修改完毕,又被覆盖,导致实际的值在打印出来的时候,没有变化,或则是全部被修改成对应的一个数
解决办法
就是重新开辟一个缓冲区,用于存储数据,参考如下
/**
* @brief 发送南向数据,即将数据解析后发送给接口板
* @param 无
* @retval 无
*/
void PR_Receive_NorthData(void)
{
uint8_t bindex=0; // 接口板组下标
uint8_t uart_uid=0; // WK2124子串口UID
uint8_t receive_len; // 接收的数据长度
static uint8_t count =0;
uint8_t buf[50];
uint8_t resourceTotal = 0; // 接口板资源总数
// 查找 ADC_DAC接口板组
for(bindex=0; bindex<AD_BoardGroupInfo_Len();bindex++)
{
uart_uid = AD_BoardGroupInfo_Index_UartUid(bindex);
receive_len = WK_PortRecvData(uart_uid, NorthDataBuffer.data, NORTHBOUND_DATA_BUFFER_LENGTH); // PS:这个要注意只要FIFO有数据就会接收过来,导致一个问题,那就是一次接收可能接收到1个字节数据或则2个或多个字节 cpu的操作速率和
if(receive_len != 0){ // wk2124子串口的速率不一致,导致cpu每次只会读取到1个字节或则几个字节的数据,这就造成程序里修改好数据,被重新读取的数据覆盖了
memcpy(&buf[count],NorthDataBuffer.data,receive_len); // 两种解决办法:1种就是直接延时等待数据接收完毕 另一种就是重新开辟一个缓冲区存储数据
count+=receive_len;
if(buf[count-2]==0x0d&&buf[count-1]==0x0a){
// 将接收的数据进行,按照路由协议对数据进行解析
PR_FrameType *frame = (PR_FrameType *)buf;
// 必须要知道当前接口板组有几个接口板,并且在当前接口板前面的资源数是多少,才能计算出新的接口资源地址
resourceTotal = AD_BoardGroupInfo_Index_TotalResources(1,frame->address);
// 修改资源地址数据
frame->address += resourceTotal;
// 将缓冲区数据上传
HAL_UART_Transmit(&huart2,buf,count,0xffff);
// 清空计数
count= 0;
}
}
}
}2.在接收的时候延时一段时间,如间隔50ms再去读取wk2124的FIFO,这样也可以达成目的,但是数据多,或则要求快,就不太适合了
#好好学习!