历史上的今天
返回首页

历史上的今天

今天是:2026年01月11日(星期日)

2023年01月11日 | STM32串口USART1中断接收和中断发送

2023-01-11 来源:zhihu

  先贴出中断函数:


  [plain] view plain copy

  void USART1_IRQHandler(void){

  IF (USART_GetiTStatus(USART1, USART_IT_RXNE) != RESET) {

  USART_ClearITPendingBit(USART1, USART_IT_RXNE);

  USART1_Buffer[i++]=USART_ReceiveData(USART1);  //USART1_Buffesh是一个自己定义的接收数组

  if(i>3){

  SendFlag = 1;

  }

  }

  if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET){  //USART_IT_TC这里也可替换

  if(Open_Send_Flag){ //这是一个发送的标志

  uart1_sendstring(temp_data);

  USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //USART_IT_TC

  Open_Send_Flag = 0;

  }

  else{

  USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //USART_IT_TC

  }

  }

  }

  发送字符串的函数:


  [plain] view plain copy

  void uart1_sendstring(uint8_t* cp)

  {

  while((*cp)!='')

  {

  Usart1_Send_isr(*cp);

  cp++;

  }

  }

  发送单个字符的函数:


  [plain] view plain copy

  void Usart1_Send_isr(uint8_t ch){

  USART_SendData(USART1, (uint8_t)ch);

  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );  //这里做缓冲区是否发送完判断

  }

  然后在中断函数外面发送数据的时候,打开发送中断。USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //USART_IT_TC


  之后再贴出两个简单的串口接收和发送的测试小例子:


  第一种:中断接收并把接收到的数据直接发送。


  [plain] view plain copy

  void USART1_IRQHandler(void){

  unsigned char RxData;

  if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {

  USART_ClearITPendingBit(USART1, USART_IT_RXNE);

  RxData=USART_ReceiveData(USART1);

  RxData = RxData + 1;

  USART_SendData(USART1,RxData);

  }

  }

  优点:简单,适合很少量数据传输。


  缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失 。


  第二种:中断接收之后判断数据头和数据尾,如果正确就直接发送出去。


  [plain] view plain copy

  void USART1_IRQHandler(void){

  if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {

  USART_ClearITPendingBit(USART1, USART_IT_RXNE);

  USART1_Buffer[i++]=USART_ReceiveData(USART1);

  }

  if((USART1_Buffer[0] == 0x01) && (USART1_Buffer[i-1] == 0x02)){

  Flag = 1;

  }

  if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET){ //溢出,不明白?

  USART_CleaRFlag(USART1,USART_FLAG_ORE);

  USART_ReceiveData(USART1);

  }

  if(Flag){

  for(j = 0;j<20;j++){

  USART_SendData(USART1,USART1_Buffer[j]);

  }

  }

  }


推荐阅读

史海拾趣

诚润电子(CHEVRON)公司的发展小趣事

诚润电子(CHEVRON)自创立之初,就以技术为核心竞争力。公司在2010年正式成立,由一群热衷于电子保护元件研发的工程师创立。他们深知,在这个日新月异的电子行业中,只有不断创新,才能在竞争中立于不败之地。因此,诚润电子从一开始就专注于电子保护元件的研发和生产,通过不断的技术创新,逐渐在市场中树立起了自己的品牌。

Endicott Research Group Inc (ERG)公司的发展小趣事

自1979年起,Endicott Research Group(ERG)就开始涉足电源转换产品的制造领域。在初创时期,公司面临着资金紧张和技术挑战,但团队坚持创新,专注于为LCD背光供电的LED驱动器及相关电源设备的研发。通过不断的试验和改进,他们成功地开发出了一系列高效稳定的产品,为公司的后续发展奠定了坚实的基础。这一时期的艰苦奋斗和技术积累,成为了ERG发展历程中的重要篇章。

CONEXANT公司的发展小趣事

在电子行业的历史长河中,洛克维尔国际是一个不可忽视的名字。作为一家由威拉德·洛克维尔创立的大型公司,洛克维尔国际通过一系列合并与收购,逐渐壮大其业务版图。然而,随着时间的推移,公司进行了战略调整,并于1996年将其半导体部门剥离。这一剥离行动最终催生了科胜讯公司(Conexant Systems),一个专注于半导体技术的独立实体。科胜讯公司继承了洛克维尔在半导体领域的深厚技术积累和市场经验,为其后续的发展奠定了坚实基础。

Genesys Logic公司的发展小趣事

进入21世纪,“General Microcircuits”开始实施全球化战略,先后在美国、欧洲、亚洲等地建立研发中心和生产基地。通过全球化布局,公司不仅能够更快地响应不同地区的市场需求,还能充分利用各地的资源优势和技术优势,进一步提升产品的竞争力和市场占有率。同时,公司还加强了与国际知名电子制造商的战略合作,共同推动半导体技术的创新与发展。

Eclipse Magnetics公司的发展小趣事

在20世纪70年代初,一家名为“General Microcircuits”的初创公司(此名称为虚构,以符合问题要求)凭借其在集成电路设计领域的突破性创新迅速崛起。公司创始人李博士带领团队研发出了一种新型低功耗微控制器,该产品在功耗管理上实现了前所未有的效率,极大地延长了便携式电子设备的电池寿命。这一技术创新迅速吸引了市场关注,多家知名电子产品制造商开始采用其芯片,推动了“General Microcircuits”在行业内的知名度与市场份额的快速增长。

大毅科技公司的发展小趣事

为了进一步提升产品质量和竞争力,大毅科技积极申请并获得了多项国际品质认证,如ISO9001、ISO14001、TS16949等。这些认证不仅证明了大毅科技在品质管理方面的卓越能力,还为公司打开了通往国际市场的大门。随着认证的不断增多,大毅科技的产品开始出口到全球各地,与索尼、雅马哈等知名企业建立了长期合作关系。

问答坊 | AI 解惑

调制解调

本帖最后由 paulhyde 于 2014-9-15 08:57 编辑 一种FSK信号调制解调电路的设计 采用锁相环芯片CD4046  …

查看全部问答>

uC_OS-Ⅱ:源码公开的实时嵌入式操作系统

uC_OS-Ⅱ:源码公开的实时嵌入式操作系统.pdf 在网上找到的,中文版的哦 有40来M呢 …

查看全部问答>

DSP芯片的定点运算

本章讨论了DSP芯片进行定点运算所涉及的一些基本问题,这些问题包括:数的定标,DSP程序的定点模拟,DSP芯片的定点运算以及定点实现非线性函数的快速实现方法等。充分理解这些问题对于用定点芯片实现DSP算法具有非常重要的作用。…

查看全部问答>

求好用的wince4.2模拟器||给下载地址也可以

内容如标题 小弟才接触wince的东西,有不知道的还请指教。 我的系统是 winXP。…

查看全部问答>

三合一板,STLINK的问题?

请教各位,我的STLINK, 1。可以对3.3V的目标板进行编程,但是不能够对5V的目标板编程。 2。STLINK一旦接上USB,芯片就很烫; 3.只连接USB接口而不连接目标板时候,2T45输出VCCB B1 B2分别是2V; 4.已经连续使用三个月了,都很正常,就最近 ...…

查看全部问答>

比较器驱动555

本人用lm339的输出作为555的vcc,发现不接555时,Lm339输出高电平为电源电压,连接555时,lm339输出低于电源电压,且和上拉电阻有关,这是为什么呢?…

查看全部问答>

Keil环境下用LPC2132控制AS-UIII机器人,GPIO操作不正常,怎么办?

用LPC2132作为主控制器控制上海未来伙伴(原广茂达)机器人有限公司的AS-UIII机器人。在 uv4 环境下建立附件所示工程后,在软件仿真模式下监控发现 main.c 中 IO0CLR = DO_C2 及 IO0CLR = DO_C1 针对GPIO功能的操作不成功。资料上说该指令是针对位 ...…

查看全部问答>

谁有PIC16F877单片机的资料啊

谁有PIC16F877单片机的资料啊…

查看全部问答>

谈谈“想”与“做”

这么多年过去了,人越来越没有激情了。之前的想到什么就做什么,从来不考虑做的事情是否有意义。而现在,没当想起要做一件事情之前,总会再三考虑有没有意义。大家说说,是想到什么就去做呢,还是要先三思,再去做。…

查看全部问答>

avr flash地址问题

本帖最后由 大头BB 于 2014-8-1 15:11 编辑 开发环境:avr studio 6    attiny841    8Kflash      地址0x0000-0x0fff 1.sudio 6 烧写flash时候地址是怎么分配的,是从0x0000开始按顺序编满为止,还是 ...…

查看全部问答>