stm32串口间通信

发布者:心若清泉最新更新时间:2018-09-09 来源: eefocus关键字:stm32  串口间通信 手机看文章 扫描二维码
随时随地手机看文章

最近要写个串口间通信的程序,要求PC端输入消息到串口1,然后stm32内部把该消息通过串口2转发出去,串口2得到消息返回,则通过串口1打印在PC端。实际上总体效果就是要是连接了设备的串口2具有串口1的功能,以便观察设备返回的信息以作后续的处理。


使用的芯片是stm32l151,采用中断接收方式,把串口2所收到的消息全部打印出来。


一开始直接参考原子的程序以接收回车键判断接收一次数据结束,实际上这样做的话会导致丢失大量信息,因为信息中可能还含有回车键。于是,便采用100ms连续接收的方式判断一次数据是否接收完成。如果两个数据之间的时间间隔超过100ms,则可以认为这两个数据不属于同一条消息了。这种机制的实现方法可以有很多,可以用定时器,也可以用简单的延时程序。在这里我用的是延时程序。


至于中断程序,因为采用的是100ms连续接收的方法,所以在中断处理中就可以简单很多了,不用判断是否收到了0x0a,0x0d之类的符号,只需要把数据寄存器里的内容保存起来就可以了。


因为串口2接的是设备,希望保存所以设备返回的信息,所以需要采用这种方法,而串口1的中断两种处理方法都可以(回车键和100ms延时)


串口2中断处理如下:


void USART2_IRQHandler(void)

{

 

char res;    

if(__HAL_USART_GET_FLAG(&UartHandle2, USART_FLAG_RXNE) != RESET)//½ÓÊÕµ½Êý¾Ý

{  

res =(uint16_t)(USART2->DR & (uint16_t)0x01FF);

if(USART2_RX_STA<800) //»¹¿ÉÒÔ½ÓÊÕÊý¾Ý

{

USART2_RX_BUF[USART2_RX_STA]=res; //¼Ç¼½ÓÊÕµ½µÄÖµ  

USART2_RX_STA++;

}

}

}



下面是判断接收完成的程序

int USART2_Scan(void)

{

uint16_t ftemp=0,i;

ftemp = USART2_RX_STA;

    if( ftemp != 0 )

    {

HAL_Delay( 100 );

while ( ftemp != USART2_RX_STA )

      {

ftemp = USART2_RX_STA;

HAL_Delay( 100 );

}

      for ( i = 0; i <= ftemp+1; i++ )

      {

RX2_Buff[i] = USART2_RX_BUF[i];                  

      }

USART2_RX_STA = 0;      /* ÖØÖÃÖ¸Õë */

return 1;

}

USART2_RX_STA=0;

return 0;

}



稍微解释一下上面的程序,


USART2_RX_STA是串口2接收缓存区的指针,在中断中该指针会随着接收消息而不断往后移

首先用一个临时指针指向它,然后用一个100ms的延时,如果还没接收完成的话

USART2_RX_STA会继续往后指,而ftemp还是原来的值,所以就可以通过判断延时后的两者是否还相等来判断是否接收完成了,如果100ms过了两个指针还相等,那么毫无疑问接收已经完成了。

要再程序中调用串口2接收的内容,只需要判断这个函数的返回值即可。接收到的内容保存了在RX2_Buff数组里。


关键字:stm32  串口间通信 引用地址:stm32串口间通信

上一篇:stm32+neo6m GPS模块定位系统
下一篇:STM32开发 -- UART应用层通信协议分析

推荐阅读最新更新时间:2024-03-16 16:13

STM32之SPI的思考
选择了与硬件打交道,就得戒骄戒躁,踏踏实实,一步一步的走下去。可能因为一个非常小的问题,就导致你失败。失败不可怕,可怕的是不能静下心来去思考。我在公司第一次调试硬件,spi的通信,是stm32的硬件既有的通信接口。之前用51的io口模拟过i2c的,感觉spi相对来说更简单些,结果调试spi的读写花费了我3天的时间。stm32f0与网上关于stm32f1大量的例程还不一样,刚刚上市半年多,应该是,并且有几项设置是stm32f1没有的,这也正是关键的地方。你直接把他们的程序拿过来用,可能就卡死了,为什么?因为f0多了个fifo设置,fifo不设置,默认应该是half of 32 bits,当你只接收到8个bit时,rxne不会置位,程
[单片机]
stm32专题九:SysTick(二)微妙和毫秒级延时
stm32系统嘀嗒定时器编程其实也很简单,这里写了两个us级延时和ms级延时函数。 bsp_systick.c 主要思路是,根据时钟频率,设置好固定的reload值,然后用传入参数不断计数;也可以根据传入参数精确计算reload值,但是可能会存在一个问题,就是如果希望的延时时间很长,24位reload寄存器可能会溢出,导致计数出错。 // 这里是重装载值固定为72,也可以根据us数来计算reload /** * @brief us级延时 */ void SysTick_Delay_us(uint32_t us) { uint32_t i; // 计时72节拍,默认时钟72M(对应1us) // 下次
[单片机]
基于MSP430、STM32的2.4G无线游戏遥控器实现
历时7天,跨度两个多星期,才将微型四轴的遥控器调试好,中间除了备考两科考试,其余时间全在宿舍蹭网消磨青春,不得不说状态不好,实际上内心也极度的空虚。 之前将微型四轴的机体做好,迫不及待的进行了一下测试,天真的以为,飞机不用遥控器也可以,实际上我设想的是直接用手头的开发板对其进行简单的增减速,为此我还 特意为它写了一个触摸控制界面,只有三个触控点,一个加速,一个减速,一个停止,非常无聊。 后来发现,没有一个遥控器真的非常不方便,周六便去二手市场仅用5元便淘得一飞机遥控器,里面电池都还没用完,质量算上乘。这遥控器是红外遥控的,用手机看了下红外管,能够正常发光实际上,我当然最希望直接对现有电路进行一下线路修改就实现最方便了,事情
[单片机]
基于MSP430、<font color='red'>STM32</font>的2.4G无线游戏遥控器实现
STM32通过调用库函数进行编程
1、调用库函数编程和直接配置寄存器编程的区别: 2、CMSIS标准: 3、STM32库函数的组织: 4、程序例举: 调用库函数实现通过USART发送数据(26个大写的英文字母) 首先:在主函数部分先要(调用自己编写的函数)对USART要用到的I/O端口进行配置、打开系统时钟配置和对USART1进行参数配置 下图是通过调用库函数对USART1的参数进行配置,将其配置成异步收发模式、波特率用户可以自定的串口: /**************************************************************************************
[单片机]
<font color='red'>STM32</font>通过调用库函数进行编程
STM32】解决引脚复用成PWM开漏输出峰值达不到外部上拉的电压
项目场景: 因为项目的一个功能需求,需要输出一个高电平为5V的PWM。 问题描述: 发现输出的PWM高电平最高只有4V不到的样子,很接近于4V。实测过普通开漏输出,高电平完全可以达到外部上拉的5V。HAL库也试过了,也是完全可以达到5V的,但是标准库的配置一直上不去。 原因分析: 仔细对比发现没啥异常,配的都是对的,但是可以肯定的是,肯定还是配置,因为HAL库可以实现,那就说明一定还是某个地方配的有问题。最后才知道开漏输出脚必须配置为浮空,不配置的话实测默认的是内部上拉。 1.内部下拉: 2.内部上拉: 3.浮空: 解决方案: 一句话:GPIO_InitStructure.GPIO_PuPd = GPIO_
[单片机]
【<font color='red'>STM32</font>】解决引脚复用成PWM开漏输出峰值达不到外部上拉的电压
STM32之TIM3_PWM程序
简介:STM32之TIM3_PWM程序详解:调整CCR2_Val的值来改变占空比,逐步的控制LED1的亮度, 占空比大过一定值时,亮度的变化就不明显了,所以CCR2_VAL最大设定到17000。 原理图: 程序分析: int main(void) { unsigned char a=0; TIM_OCInitTypeDef TIM3_OCInitStructure; RCC_Configuration(); time_ini(); SysTick_Config(72000); //配置SYSTICK时钟节拍为1ms一次 while(1){ Delay(1);//延时1ms TIM3
[单片机]
<font color='red'>STM32</font>之TIM3_PWM程序
STM32 正交编码器代码
/******************** (C) COPYRIGHT 2007 STMicroelectronics ******************** * File Name : stm32f10x_encoder.c * Author : IMS Systems Lab * Date First Issued : 21/11/07 * Description : This file contains the software implementation for the * encoder unit ***********************************
[单片机]
使用VSCode搭建STM32开发环境
首先附上一张VS Code图一直都喜欢这种,黑色主题感觉高大上。 一、需要的软件和工具。 下载最新版VS Code: 安装好插件,具有良好的代码补全与调试功能。 “VS Code下载地址:https://code.visualstudio.com/” 下载 LLVM:用于代码补全,其实可以理解为 Clang。因为VS Code 中“C/C++”插件的自动补全功能不太好用。STM32中好多库函数都补全不出来。记得按照好之后,将路径添加到环境变量里。 “LLVM下载地址:http://releases.llvm.org/download.html” 下载安装 Git for Windows: 提供Git支持和MINGW64指令终端
[单片机]
使用VSCode搭建<font color='red'>STM32</font>开发环境
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved