Code 0001: Wait rx completed

注意:以下Demo适用于不带DMA功能的串口。

Demo0001

/* 方法: wait_rx函数每1ms扫描串口是否有接受数据,如果长时间没有收到数据,则接受完成。

 * 分析: 该方法存在的问题是扫描时间需要配合串口波特率进行设置, 好处是数据传输没有特殊格式要求。

 */

static struct
{
  uint16 index;
  uint8 items[LORA_UART_RECV_BUF_SIZE];
}lora_uart_rx_buf;

/*
 * @fn      halKeyPort1Isr
 * @brief   Port1 ISR
 * @param
 * @return
 */
HAL_ISR_FUNCTION(halGPRSUartIsr,URX0_VECTOR)
{  
  URX0IF = 0;                
  if(lora_uart_rx_buf.index >= LORA_UART_RECV_BUF_SIZE)
    lora_uart_rx_buf.index = 0;
  lora_uart_rx_buf.items[lora_uart_rx_buf.index ++] = U0DBUF;   
} 

/*
 * @fn      wait_rx
 * @brief   wait for rx completed
 * @param   none
 * @return  none
 */
uint8 wait_rx(uint32 times)
{
  uint8 timeout = 0;
  uint8 pre_cnt = 0;
  while(timeout++<times){
    if (lora_uart_rx_buf.index > 0) {
        pre_cnt = lora_uart_rx_buf.index;
        break;
    }
    lora_delayms(1);      /* todo: should be replaced */
  }
  if (timeout >= times) {
      return 0;
  }
  lora_delayms(1);        /* todo: should be replaced */
  while(lora_uart_rx_buf.index != pre_cnt) {
     pre_cnt = lora_uart_rx_buf.index;
     lora_delayms(1);     /* todo: should be replaced */
  }
  return 1;
}

 Demo0002

/* 方法: 约定结束标志,以接收到结束标志完成接受

 * 分析: 该方法存在的问题是必须按照规定的格式发送数据, 好处是不需要考虑波特率等串口特性。

 */

void USART1_IRQHandler(void)                    
{
  u8 Res;
   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
   Res =USART_ReceiveData(USART1);
   if((USART_RX_STA&0x8000)==0) {
     if(USART_RX_STA&0x4000) {
         if(Res!=0x0a) {
        USART_RX_STA=0;
      }  else {
        USART_RX_STA|=0x8000; }
    }
else {   if(Res==0x0d) { /* end with 0x0d */
        USART_RX_STA|=0x4000;
      } 
else {          USART_RX_BUF[USART_RX_STA&0X3FFF]=Res;          USART_RX_STA++;          if(USART_RX_STA>(USART_REC_LEN-1)) {
           USART_RX_STA=0; } } }   } }

 

 Demo0003

/* 方法: timeout实现,timeout时间内未收到数据,结束本次数据接收

 * 分析: 该方法和Demo0001原理相同,只是实现方式有所区别,这边将timeout写入接受函数里。

 */

/**
  *name  : UART_Recv
  *brief : UART receive data
  *param : UARTx : Select UART peripheral, UART0/2/3 and UART1
  *        *rxbuf: pointer of rx buffer
  *        rxlen : length of receiving data
  *retval: length of receiving data
  */
uint8_t UART_Recv(UART_TypeDef* UARTx, uint8_t *rxbuf, uint8_t rxlen)
{
    uint32_t len = 0, timeout;
    while(rxlen){
        timeout = UART_BLOCKING_TIMEOUT;
        while (!(UARTx->LSR & UART_LSR_RDR)){
            if (timeout == 0) break;
            timeout--;
        }
        if(timeout == 0) break;
        
        *rxbuf++ = UART_RecvData(UARTx);
        rxlen--;
        len++;
    }
    return len;
}
posted @ 2016-10-12 20:46  窝窝头HZ  阅读(245)  评论(0编辑  收藏  举报