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

转载于:https://www.cnblogs.com/HongZheng/p/5954366.html

Code 0001: Wait rx completed相关推荐

  1. SAP MM 执行事务代码MRRL报错-No message was found for partner 100065 company code 0001-

    SAP MM 执行事务代码MRRL报错-No message was found for partner 100065 company code 0001- 1, 执行事务代码MRRL 触发invoi ...

  2. Rx第三部分--深入序列

    系列文章的第三部分将看一下Rx的除前面提到的简单代码外的其他特性.要构建高质量代码,通常需要处理错误.记录日志.特定场景下重试.释放资源.及在范例中剔除的其他现实问题. 本文的目的是让你将Rx当成工具 ...

  3. Observables简介以及它们与Promise有何不同

    'Observables', 'Observables', 'Observables'...Yes! Today, we will talk about this often discussed wo ...

  4. 【RxSwift 实践系列 2/3】thinking in Rx- Create和Drive

    ---> 上节 [RxSwift 实践系列 1/3]为什么使用RxSwift RxSwift 是一种编程思想,不是一门语言,学习他最难的部分就是thinking in Reactive Prog ...

  5. 华工软院IBM LinuxONE Community Cloud云计算实验文档

    此博文介绍华南理工大学软件学院"云计算开发与应用"实验课.本人在大二期间选修了这门课,实验课内容是把已有的app部署到云服务器上运行.虽然实验内容很简单(作者大概一个小时就做完了两 ...

  6. wkwebView基本使用方法

    WKWebView有两个delegate,WKUIDelegate 和 WKNavigationDelegate.WKNavigationDelegate主要处理一些跳转.加载处理操作,WKUIDel ...

  7. git 设置有效目录_如何有效使用Git

    git 设置有效目录 The code was working yesterday but today it is not 该代码昨天有效,但今天却没有 The code got deleted 代码 ...

  8. 异步/等待-什么时候返回Task vs void?

    本文翻译自:async/await - when to return a Task vs void? Under what scenarios would one want to use 在什么情况下 ...

  9. DataView.RowFilter使用

    有如下的DataView,现在按大类小类打印出分类列表.         DataView dv = F.Studio.Trade.BLL.ClassBLL.Query().Tables[0].Def ...

最新文章

  1. 网站采用自建服务器的优点,企业自建网页的方法是怎样的,自建网站有哪些优点呢?...
  2. es 映射 mysql_ElasticSearch系列02:ES基础概念详解
  3. (转) Twisted :第十九部分 改变之前的想法
  4. Linux下使用wc命令快速统计所有文件的行数
  5. vue设置多选框默认勾选_vue中复选框怎么默认全选,至少选择4个才可以点击下一步...
  6. 2020 年微服务领域开源数字化报告发布,阿里扛起微服务大旗
  7. rs429-HI3282-HI3182笔记
  8. 计算机网卡的安装过程,千兆网卡怎么装_千兆网卡安装步骤
  9. 因为在此系统上禁止运行脚本_按键精灵调试脚本常见问题
  10. 重新加载script
  11. nodejs基于微信小程序的图书销售商城系统 uniapp 小程序
  12. python第三方库re库基本介绍
  13. IDM一直弹出下载框怎么办?
  14. 微信商城商家该如何运营
  15. BLE4.0低功耗蓝牙学习1. 蓝牙4.0ble协议栈的构成
  16. C语言每日一练——第32天:小球自由下落问题(第10次落地经过多少米,反弹多高?)
  17. 文件后缀名大全及其说明表
  18. Ad15的元器件的3D制作
  19. 为超链接设置屏幕提示
  20. 残差神经网络 ResNet

热门文章

  1. MySQL 基础 ———— 连接查询
  2. LeetCode算法入门- Remove Nth Node From End of List -day17
  3. java反序列化异常接不到_由Java对象反序列化异常想到的
  4. Web前端期末大作业--响应式健身会所网页设计(HTML+CSS+JS)实现
  5. mysql-5.1.73-8.el6_在centos中安装mysql详细步骤说明
  6. Java反射机制是什么?
  7. Eclipse编辑器字体大小的设置
  8. 华师计算机基础在线作业秋,18秋华师《计算机基础》在线作业(20210408185935).pdf...
  9. 山东大学 2020级数据库系统 实验五
  10. 数学建模学习笔记(二)——Topsis优劣解距离法