注意:以下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;
}