如何控制串口每次接收数据的个数
时间:10-02
整理:3721RD
点击:
我想每次发送或者接收的数据最大在20个字节以内,如有30个数据从串口进行通信,我想首先值接收20个其余10个下一次在进行接收,不知道如何实现?
我有自己写的回调函数,在OnBoard.c中定义如下:
//串口回调函数 static void SerialCallback( uint8 port, uint8 event ) { mtOSALSerialData_t *pMsgSerial; uint8 flag=0,i,j=0; //flag是判断有没有收到数据,j记录数据长度 uint8 buf[128]={0}; //串口buffer最大缓冲默认是128,我们这里用128. (void)event; // Intentionally unreferenced parameter while (Hal_UART_RxBufLen(port)) //检测串口数据是否接收完成 { HalUARTRead (port,&buf[j], 1); //把数据接收放到buf中 j++; //记录字符数 flag=1; //已经从串口接收到信息 } delay(900); delay(1200);//防止数据过快造成数据丢失 /*j = Hal_UART_RxBufLen(port); HalUARTRead(port,buf,j);*/ if(j>0) flag = 1; else flag = 0; if(flag==1) //已经从串口接收到信息 { /* Allocate memory for the data */ //分配内存空间,为机构体内容+数据内容+1个记录长度的数据 pMsgSerial = (mtOSALSerialData_t *)osal_msg_allocate( sizeof ( mtOSALSerialData_t )+j+1); pMsgSerial->hdr.event = SERIAL_MSG; // 事件号用SERIAL_MSG,需要添加 pMsgSerial->msg = (uint8*)(pMsgSerial+1); // 把数据定位到结构体数据部分 pMsgSerial->msg [0]= j; //给上层的数据第一个是长度 for(i=0;i<j;i++) //从第二个开始记录数据 pMsgSerial->msg [i+1]= buf[i]; osal_msg_send( registeredSerialTaskID, (uint8 *)pMsgSerial ); //登记任务,发往上层 //osal_msg_send( registeredSerialTaskID, (uint8 *)pMsgSerial ); //登记任务,发往上层 /* deallocate the msg */ osal_msg_deallocate ( (uint8 *)pMsgSerial ); //释放内存 } }
串口初始化函数如下:
void UartInit(void) { halUARTCfg_t uartConfig; /* UART Configuration */ uartConfig.configured = TRUE; uartConfig.baudRate = HAL_UART_BR_2400;//HAL_UART_BR_115200; uartConfig.flowControl = HAL_UART_FLOW_OFF; uartConfig.flowControlThreshold = MT_UART_THRESHOLD; uartConfig.rx.maxBufSize = MT_UART_RX_BUFF_MAX; uartConfig.tx.maxBufSize = MT_UART_TX_BUFF_MAX; uartConfig.idleTimeout = MT_UART_IDLE_TIMEOUT; uartConfig.intEnable = FALSE;//TRUE; //uartConfig.callBackFunc = NULL; uartConfig.callBackFunc = SerialCallback; HalUARTOpen (HAL_UART_PORT_0, &uartConfig); }