一、定长接收---采用
二、以特定的符号作为结束符
问题:①单个字符接收②转义字符
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
- if(huart->Instance == USART1){
- Rx_Flag = 1;
- }
- }
-
- void UART_Proc_EOC(){
- static int trans_state = 0;
- if(Rx_Flag){
- Rx_Flag = 0;
- switch(trans_state){
- case 0:
- if(RxTemp == TRANS_CHAR)//如果接收到的字符是转义字符
- trans_state = 1;//就让其标志为1
- else if(RxTemp == END_CHAR){//如果接收到的字符是结束符
- Update_Flag = 1;//就意味着本次接收已经结束
- }
- else {
- RxBuf[RxCount++] = RxTemp;//如果接收到的是数据,就把该字符放到数组里
- }
- break;
- case 1://当接收到的字符是转义字符或者结束字符
- if(RxTemp != END_CHAR){//是转义字符但不是结束字符
- RxBuf[RxCount++] = TRANS_CHAR;//此转义字符是数据,要将他写进数组
- RxBuf[RxCount++] = RxTemp;
- }
- else {
- RxBuf[RxCount++] = RxTemp;
- trans_state = 0;
- break;
- }
- }
- if(Update_Flag == 0){//表明还没有遇到结束字符,仍需要继续接收中断
- HAL_UART_Receive_IT(&huart1, &RxTemp, 1);
- }
- }
复制代码
三、采用空闲中断的方式(字符串基本上是连续发送,一旦空闲实践大于某个时间,就认为这串数据接收完了),适用于不定长的接收
①常规配置
②中断的方式
函数中
在中断模式下接收一定量的数据,直到接收到预期数量的数据或者发生空闲中断
HAL_UART_ReceiveToIdle_IT(&huart1, (uint8_t *)USART_RxBuf, Rx_Len);//IDLE使用
写上这个函数表明接收端已经开启了空闲中断
四、DMA接收,适合接收大量的数据,一般用在报文(协议)的传输,找完整的报文(有格式)
————————————————
版权声明:想要优秀点儿
|