首页 > 代码库 > Code 0001: Wait rx completed

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; } } }   } }

 

Code 0001: Wait rx completed