首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。