首页 > 其他分享 >串口常见操作

串口常见操作

时间:2024-02-02 16:56:09浏览次数:35  
标签:定时器 STA 常见 RX TIM 串口 操作 USART3 TIM7

如何判断一组数据是否发送完毕

采用缓冲数组加定时器的方式

首先定义一个标志位USART3_RX_STA,标志位的最高位判断数据是否收发完毕,1表示接收完毕,0表示没有接收完毕。采取的机制是定时器定时时间一到定时器中断就将USART3_RX_STA最高位置1,而串口中断要做的就是在定时间到之前及时将定时器的计数器清0,防止USART3_RX_STA最高位置1。这样的话连续的数据接收时间差不超过定时时间,USART3_RX_STA最高位也不会被置1。也就是认为连续的数据接收时间差不超过定时时间那么这两个数据同属一组数据。

 1 void TIM7_IRQHandler(void)
 2 {         
 3     if(TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET)//是更新中断
 4     {                    
 5         TIM_ClearITPendingBit(TIM7, TIM_IT_Update  ); //清除TIM7更新中断标志    
 6         
 7         USART3_RX_STA|=1<<15;     //标记接收完成
 8         TIM_Cmd(TIM7, DISABLE); //关闭TIM7 
 9     }        
10 }
11 
12 //如果2个字符接收间隔超过timer,则认为不是1次连续数据
13 //接收到的数据状态
14 //[15]:0,没有接收到数据;1,接收到了一批数据.
15 //[14:0]:接收到的数据长度
16 vu16 USART3_RX_STA=0;       
17 
18 void USART3_IRQHandler(void)
19 {
20     u8 res;          
21     if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据
22     {     
23         res =USART_ReceiveData(USART3);         
24         //timer.c里有个定时器中断,定时器10ms进一次中断将USART3_RX_STA第15位置1代表本次数据传输完成,不会进入if也就不会往USART3_RX_BUF[USART3_RX_STA++]写入数据
25         //也就是说它认为每10ms是一次数据的传输,超过10ms就是下一次数据了
26         if((USART3_RX_STA&(1<<15))==0)              
27             
28         { 
29             if(USART3_RX_STA<USART3_MAX_RECV_LEN)    //数据的接收不能超过最大长度
30             {            
31                 TIM_SetCounter(TIM7,0);             //计数器清空                          
32                 if(USART3_RX_STA==0)                 //使能定时器7的中断 
33                 {
34                         TIM_Cmd(TIM7,ENABLE);           //使能定时器7
35                 }
36 
37                 USART3_RX_BUF[USART3_RX_STA++]=res;    //记录接收到的值     
38             }else 
39             {
40                 USART3_RX_STA|=1<<15;                //如果超过最大长度强制标记接收完成
41             } 
42         }
43     }                                                                
44 }   

 

标签:定时器,STA,常见,RX,TIM,串口,操作,USART3,TIM7
From: https://www.cnblogs.com/Sandals-little/p/18003460

相关文章

  • 动力节点最新RocketMQ基本操作-01
    动力节点最新RocketMQ基本操作1. RocketMQ简介MQ====MessageQueue编程中的 同步:排队一个一个走;一个动作做完以后,才能进行下一个异步:各走各的;两个动作可以同时做;官网:  http://rocketmq.apache.org/ RocketMQ是阿里巴巴2016年MQ中间件,使用Java语言开发,RocketMQ 是......
  • Git的常用操作
    首次使用git时要设置name和emailgitconfig--globaluser.name"testname"gitconfig--globaluser.email"[email protected]"克隆远程仓库到本地gitcloneURL如果你在本地已经有代码了,想推送到一个新的远程仓库cd代码所在的目录gitinitgitadd--allgitcommit......
  • Qt 调试器常见异常
    1.变量无提示信息,解决办法:工具->选项->调试器->概要->选中《当调试时在主编辑器中启用工具提示》2.CDB断点调试,解决无法查看QString值。运行至断点时,程序卡死。解决办法:打开“工具->选项->调试器->CDB”,把“UsePythondumper”选项勾选去掉,保存即可。3.CDB调试速度慢,解决办法如......
  • 【教程】苹果上架要求有哪些常见要点?
    ​苹果上架要求是苹果公司对于提交应用程序到苹果商店上架的要求和规定。这些要求主要是为了保证用户体验、应用程序的质量和安全性。以下是苹果上架要求的详细介绍:1.应用程序的内容和功能必须符合苹果公司的规苹果上架要求是苹果公司对于提交应用程序到苹果商店上架的要求和规......
  • 操作DOM常用的方法和属性总结
    document.querySelector()返回指定css选择器的第一个元素对象document.querySelectorAll()返回指定css选择器的所有元素对象textContent设置或获取元素中的文本内容style:display设置或获取元素的显示类型textAlign设置或获取文本对齐方式transform向元素应用2D或3D转换......
  • 【深度学习】从0完整讲透深度学习第2篇:TensorFlow介绍和基本操作(代码文档已分享)
    本系列文章md笔记(已分享)主要讨论深度学习相关知识。可以让大家熟练掌握机器学习基础,如分类、回归(含代码),熟练掌握numpy,pandas,sklearn等框架使用。在算法上,掌握神经网络的数学原理,手动实现简单的神经网络结构,在应用上熟练掌握TensorFlow框架使用,掌握神经网络图像相关案例。具体包......
  • linux常见问题
    一、依赖包安装1.1离线安装在无网环境部署服务器时,需要离线安装很多软件,如gcc,cmake,tmux等,这时就要提前在有网环境下下载离线安装包。有的软件只需要一个单独的deb包安装即可,如net-tools,而有的软件有很多的依赖包,如gcc,这时就需要一个简单的方法来批量下载所有依赖deb包。这......
  • 数组操作
    filterconsta=[{"id":"1","name":"张三"},{"id":"2","name":"李四"}]a.filter(it=>it.id==="1")//[{"id":"1","name":"张三&qu......
  • concurrent hashmap put操作的线程安全
     减小锁粒度:将Node链表的头节点作为锁,若在默认大小16情况下,将有16把锁,大大减小了锁竞争(上下文切换),就像开头所说,将串行的部分最大化缩小,在理想情况下线程的put操作都为并行操作。同时直接锁住头节点,保证了线程安全Unsafe的getObjectVolatile方法:此方法确保获取到的值为最新  ......
  • Python3 操作ES7
    Python3操作ES7 Python3操作ES71、连接ES7,创建索引fromelasticsearchimportElasticsearches=Elasticsearch(['127.0.0.1:9200'])index_name='student'request_body={"mappings":{"properties":{......