如何控制串口每次接收数据的个数
时间: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);
}
