最近调试STM32的串口接收时发现例程中只能接收一个字节

例程如下:

 1 //初始化串口12  void uart_init(u32 bound){3     //GPIO端口设置4     GPIO_InitTypeDef GPIO_InitStructure;5     USART_InitTypeDef USART_InitStructure;6     NVIC_InitTypeDef NVIC_InitStructure;7      8     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);    //使能USART1,GPIOA时钟9      USART_DeInit(USART1);  //复位串口1
10      //USART1_TX   PA.9
11     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
12     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
13     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
14     GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
15
16     //USART1_RX      PA.10
17     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
18     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
19     GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10
20
21    //Usart1 NVIC 配置
22
23     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
24     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
25     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3
26     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
27     NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器
28
29    //USART 初始化设置
30
31     USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
32     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
33     USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
34     USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
35     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
36     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式
37
38     USART_Init(USART1, &USART_InitStructure); //初始化串口
39     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
40     USART_Cmd(USART1, ENABLE);                    //使能串口
41
42 }
43 void USART1_IRQHandler(void)                    //串口1中断服务程序
44     {
45     u8 Res;
46     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
47         {
48         //USART_ClearITPendingBit(USART1,USART_IT_RXNE);
49         Res =USART_ReceiveData(USART1);//(USART1->DR);    //读取接收到的数据
50         USART_RX_BUF[buf_index++]=Res;
51
52         }
53
54 }
55
56
57         

这是较为普遍的源码例程的写法,用原子的版本改的。这本身没问题,但是,一旦运行,就会发现,只能接收一个字节,后面的都会丢失,调了1天没找到原因,一搜索发现很多类似的情况。

后来正准备改用DMA时偶然找到问题所在,就是这句:

24     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
25     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3

改为

24     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;
25     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

后问题解决。

注意,不要在中断中执行发送接收过程,存在中断嵌套的问题,会造成只执行一次的现象。

关于STM32串口接收中断中只能接收一个字节()相关推荐

  1. STM32移植RT-Thread的串口只能接收一个字节数据的问题

    特别值得注意的地方,事先在rtconfig.h里面把#define RT_USING_CONSOLE和#define RT_USING_FINSH都注释掉.

  2. STM32串口通信中使用printf发送数据配置方法 开发环境 Keil

    STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) 已有 12456 次阅读2011-6-29 23:29 | 在STM32串口通信程序中使用printf发送数据, ...

  3. 在/proc/devices中只能看见一个,请问是什么原因

    在/proc/devices中只能看见一个,请问是什么原因 #include <linux/module.h> #include <linux/types.h> #includ ...

  4. c语言程序只能有一个源程序文件,下列说法哪个正确?() A.一个程序可以包含多个源文件 B.一个源文件中只能有一个类 C.一个源文件中可以...

    下列说法哪个正确?() A.一个程序可以包含多个源文件 B.一个源文件中只能有一个类 C.一个源文件中可以 更多相关问题 [问答题,简答题] 古埃及服饰中时常看到"蛇"." ...

  5. 嵌入式之串口中断只能收到一个字节

    串口中断只能收到一个字节原因排查: 1.中断程序占用时间过长,导致后面的数据到达的时候无法接受. 2.中断清除标志位. 3.串口中断优先级太低,导致中断嵌套.将优先级设为最高.

  6. 当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式

    当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式. 比如 select * from T_Employee where FNumber not in ( select top 5* ...

  7. FPGA 串口中断_一个严谨的STM32串口DMA发送amp;接收(1.5Mbps波特率)机制

    昨天分享的<嵌入式大杂烩读者福利:第一期>大家有去抽奖吗,没抽的可参与抽奖,碰碰运气.我最喜欢抽奖了,还记得前几个月疫情严重时期连抽中了3包口罩,真刺激,哈哈.之后多多安排抽奖,敬请期待. ...

  8. 串口协议的制定以及串口中怎样接收一个完整数据包的解析

    里以串口作为传输媒介,介绍下怎样来发送接收一个完整的数据包.过程涉及到封包与解包.设计一个良好的包传输机制很有利于数据传输的稳定性以及正确性.串口只是一种传输媒介,这种包机制同时也可以用于SPI,I2 ...

  9. STM32串口发送数据和接收数据方式总结

    文章目录 串口发送数据 串口接受数据 串口发送数据 1.串口发送数据最直接的方式就是标准调用库函数 . void USART_SendData(USART_TypeDef* USARTx, uint1 ...

最新文章

  1. 12 Java面向对象之多态
  2. 标志寄存器的详细解释
  3. 判断是否Ajax请求
  4. gpu云服务器运行游戏_GPU云服务器可以挂载大型游戏吗?
  5. 公共语言运行库中的程序集-04强命名的程序集
  6. [gstreamer][001] Seek issues and so on
  7. java基础—IO流——将一些字符写入到指定硬盘上的目录中去:
  8. 第八篇:ZTree操作总结
  9. frontcon函数用不了_MQL4课程——账户信息函数和检测函数
  10. mysql 利用延迟关联优化查询(select * from your_table order by id desc limit 2000000,20)
  11. 第五章(1.7)深度学习——常用的八种神经网络性能调优方案
  12. 自动化学科前沿讲座作业 基于深度学习的工厂人员监测系统设计
  13. vue + ElementUI + BMap 百度地图实现地图选址定位并获取地址信息
  14. ubuntu firefox不能播放MP4,ubuntu Firefox flash 浏览器全屏置顶
  15. 书论51 朱文长《续书断》
  16. python导出百万数据到excel_使用python将大量数据导出到Excel中的小技巧分享
  17. 【Eclipse报错】Faceted Project Problem:Target runtime Apache Tomcat v8.0 is not defined.
  18. 哗哗地照样子写词语_描写哗哗的词语
  19. [STL乱搞]51 Nod——1573 美丽的集合
  20. my_RIO实现小车避障

热门文章

  1. iOS开发- 隐藏状态栏(电池栏)
  2. Revit二次开发——结构模型构件自动扣减
  3. ggplot2学习笔记5:工具箱(一)基础图层、标签、注释、群组几何对象、曲面图
  4. CAS:2379387-10-5;TPE-丙烯酰胺;AIE聚集诱导发光
  5. 训练自己的词向量模型
  6. Java Activiti 工作流引擎 springmvc SSM 流程审批 后台框架源码
  7. 供应链对全球手机市场相当悲观,iPhone出货量将进一步下滑
  8. 牛掰!阿里大佬用7部分讲明白Web安全攻防 渗透测试(学完可就业)
  9. 7-15 单继承中的构造函数与析构函数 (10 分)
  10. 科沃斯擦玻璃机器人使用感受_科沃斯擦玻璃机器人W83S,正在纠结的看过来