微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 如何控制串口每次接收数据的个数

如何控制串口每次接收数据的个数

时间: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);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top