基于STM32实现串口的两个分案解析

发布者:Weasel最新更新时间:2024-02-27 来源: elecfans关键字:STM32  串口  全双工 手机看文章 扫描二维码
随时随地手机看文章

首先总结一下串口232,422,485

串口232:可双向传输,全双工,最大速率20Kbps,负逻辑电平,-15V~-3V逻辑“1”,+3V~+15V逻辑“0”。


串口422:可双向传输,4线全双工,2线单工。

串口485:可双向传输,4线全双工,2线单工,最大速率10Mb/s,差分信号,发送端:+2V~+6V逻辑“1”,-2V~-6V逻辑“0”,接收端:+200mV逻辑“1”,-200mV逻辑“0”。

对于串口的实现有以两个方案:

方案一,和原子的《例说STM32》一样,首先接收,然后处理,没有消息验证处理,这样就会出现消息覆盖,消息出错后死机,无法明确区分命令,无法及时应答握手信号。方案二,借鉴uC/OSII的消息队列,进入中断服务函数之后,关闭中断,接收数据,如果没有数据接收,等待一段时间(时间和波特率有关)后开中断,出中断,然后在对接收到的数据进行处理,下面看代码:

基于STM32实现串口的两个分案解析

消息队列及其初始化函数:

/*osq结构体来管理消息队列*/

typedefstructos_q{/*QUEUECONTROLBLOCK*/

u8*OSQStart;/*Pointertostartofqueuedata*/

u8*OSQEnd;/*Pointertoendofqueuedata*/

u8*OSQIn;/*PointertowherenextmessagewillbeinsertedintheQ*/

u8*OSQOut;/*PointertowherenextmessagewillbeextractedfromtheQ*/

u8OSQSize;/*Sizeofqueue(maximumnumberofentries)*/

u8OSQEntries;/*Currentnumberofentriesinthequeue*/

}OS_Q;

OS_Q*posq,osq;

u8USART_RX_BUF[length_buff];//循环队列,存储接受的信息。

voidOS_QInit()//初始化结构体

{

posq=&osq;

posq-》OSQStart=USART_RX_BUF;

posq-》OSQEnd=&USART_RX_BUF[length_buff];

posq-》OSQIn=USART_RX_BUF;

posq-》OSQOut=USART_RX_BUF;

posq-》OSQSize=length_buff;

posq-》OSQEntries=0;

}

///*在中断函数中将一条消息的所有字节一次性得保存在消息队列中*/

u8message_buff[20];

voidUSART1_IRQHandler(void)

{

u8num=0;

//u8i;

u8time=0;//接受超时技术

USART1-》CR1&=0XFFDF;

LED=!LED;

while(1)

{

if(USART1-》SR&(1《《5))//如果有数据收到的话,将消息存在消息队列中

{

message_buff[num]=(u8)USART1-》DR;

num++;

*posq-》OSQIn++=(u8)USART1-》DR;

posq-》OSQEntries++;

if(posq-》OSQIn==posq-》OSQEnd)

{

posq-》OSQIn=posq-》OSQStart;

}

time=0;

}

else

{

delay_us(10);

time++;

if(time》=50)break;

}

}

USART1-》CR1|=0X0020;

}


这样就把数据一次性全部存储下来了,剩下的就是对消息缓冲器message_buff[]中的消息进行处理了,这样就解决了消息覆盖,消息出错无法纠正的问题,至于消息怎么处理就是依据不同的需求不同的处理,另外注意,握手信号好用定时器中断


关键字:STM32  串口  全双工 引用地址:基于STM32实现串口的两个分案解析

上一篇:如何使用STM32实现systick的精确延时
下一篇:stm32定时器优先级

推荐阅读最新更新时间:2024-11-03 11:08

完成stm32上HID的应用
这个是公司的项目,以前基于usb的虚拟串口来做上下位机通信,由于usb平时也就刷参数和调试之用,也不很常用,外面反应usb有时会连不上stm32控制器,心里一直认为不是大问题,后来反应的多了,就重视这个事情了,虽然usb平时不用,但是用的时候只要出现异常掉线,就再也连不上去了,特别影响用户对我们产品的信心。 在网上找了很多资料,到现在也只能隐约确定是stm32官方的虚拟串口库有问题,我发现不同的电源板都会影响到usb虚拟串口的枚举,于是下定决心使用其他方式来做上下位机的连接,排除了usb虚拟串口,眼前的选择只有两个 1)usblib,这个是针对usb的上位机库,可以玩很多的花样,但是需要开发者稍稍熟悉usb协议,而且这个需要在
[单片机]
c#串口通讯软件设计
最近工作用到modbus,同时也用到了上位机软件,看到主管用vb写的软件可以通过串口与我的下位机通讯,显示数据,觉得很好玩。所以回家一时冲动,就下了个vs2005,准备也搞一搞,但用个啥语言呢?思考了一下,vb--太老,c++,太复杂,java,貌似得加软件,没敢玩,最后思来想去,决定了一个比较靠普的语言,c#,这个目前写软件还是比较流行的,用的人很多,例子也很多,关键是类似vb,但是以c为基础的。所以很适合我。下面是通过了1天艰苦奋斗,写的一个破串口通讯软件 调试的截屏,有点傻,不过基本功能还是可以的,计数,发送,接受,串口,波特率设置,都是可以设置的,不过校验目前还没有,第一步算是搞定了,以后慢慢完善。 发现这东西
[单片机]
c#<font color='red'>串口</font>通讯软件设计
STM32学习笔记之开发环境
本文主要由两部分组成,一是STM32开发环境MDK-ARM的介绍及安装,一是STM32官方库文件的下载与配置。 一、开发环境安装 (一)开发环境简介 KEIL公司目前有四款独立的嵌入式软件开发工具,即MDK、KEIL C51、KEIL C166、KEIL C251,它们都是KEIL公司品牌下的产品,都基于uVision集成开发环境,其中MDK是RealView系列中的一员。而MDK-ARM、KEIL MDK、RealView MDK、KEIL For ARM,都是同一个东西,ARM公司现在统一使用MDK-ARM的称呼。 KEIL MDK开发工具源自德国 Keil 公司,被全球超过 10 万的嵌入式开发工程师验证和使用,是ARM公
[单片机]
<font color='red'>STM32</font>学习笔记之开发环境
STM32之点亮LED
学习一个新的处理器,第一个程序肯定就是点亮LED,它可以让我们较快的、较清晰的了解到一个处理器的程序结构,学习32也不例外,首先第一个程序我们就来点亮LED,点亮LED程序有很多种,这里我们用库函数来实现LED的闪烁 本人使用的开发板是正点原子的精英版开发板。 首先复制一下我们之前建好的工程模板,然后把文件夹命名为LED。 然后打开这个工程文件,第一步我们需要再建立两个空白页,并按照我上一篇博客的方法把他俩存到HARDWARE文件夹里面,一个命名为led.c,另一个命名为led.h,然后再在keil MDK软件里面把这两个文件给添加到工程中去,添加完之后,我们的工程结构如下图 添加完之后,我们不要忘记要把
[单片机]
<font color='red'>STM32</font>之点亮LED
stm32之模拟i2c驱动ht16c22
iic.h文件如下: #ifndef _stm32f103_myi2c_h_ #define _stm32f103_myi2c_h_ //IO方向设置 #define SDA_IN() {GPIOB- CRH&=0XFFFF0FFF;GPIOB- CRH|=8 12;} #define SDA_OUT() {GPIOB- CRH&=0XFFFF0FFF;GPIOB- CRH|=3 12;} //IO操作函数 #define IIC_SCL PBout(10) //SCL #define IIC_SDA PBout(11) //SDA #define READ_SDA PBin(11) //输入SDA //ht16c22
[单片机]
基于stm32的数字示波器设计方案
0 引言 随着集成电路的发展和数字信号处理技术的采用,数字示波器已成为集显示、测量、运算、分析、记录等各种功能于一体的智能化测量仪器。数字示波器在性能上也逐渐超越模拟示波器,并有取而代之的趋势。与模拟示波器相比,数字示波器不仅具有可存储波形、体积小、功耗低,使用方便等优点,而且还具有强大的信号实时处理分析功能。因此,数字示波器的使用越来越广泛。目前我国国内自主研发的高性能数字示波器还是比较少,广泛使用的仍是国外产品。因此,有必要对高性能数字示波器进行广泛和深入研究。 本文通过采用高速高性能器件,设计了一实时采样率为60 msa/s的宽带数字示波器。 1 数字示波器的性能参数设计 数字存储示波器的指标很多,包括采样率、带宽、灵敏度、
[单片机]
基于<font color='red'>stm32</font>的数字示波器设计方案
STM32 F7如何满足嵌入式系统更高处理性能需求
  意法半导体(ST)日前宣布推出业界首款基于ARM最新Cortex-M7内核的STM32 F7系列微控制器,其性能远超ST之前的32位STM32F4微控制器,通过无缝升级路径可将处理性能和DSP性能提高一倍。   “作为STM32微控制器产品家族的高端产品,STM32 F7使内存和外存的性能达到一个新的水平,给开发人员带来新的创新机会,保证他们不需要再根据存储器性能调整代码。”ST微控制器市场总监Daniel Colonna表示,“而之所以能够在业内率先推出基于Cortex-M7的产品,首先得益于ST与ARM密切的合作关系。其次,ST也与第三方客户保持着广泛的合作,确保他们能够及时得到ARM最新的技术支持并推出新产品。强大的
[电源管理]
<font color='red'>STM32</font> F7如何满足嵌入式系统更高处理性能需求
STM32MCU电源的低功耗模式
先看一下数据手册上对低功耗 的介绍。 1、睡眠模式(sleep mode) 仅仅是内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行。 2、低功耗运行模式(Low-power run mode) 该模式通过低功率调节器提供的VCORE来实现,以最小化 调节器的工作电流。代码可以从SRAM或Flash执行, CPU频率限制在2MHz。具有独立时钟的外围设备时钟可以来自HSI16。 3、低功耗睡眠模式(Low-power sleep mode) 从低功耗运行模式进入该模式。只有CPU时钟停止。当有事件或中断触发唤醒时,系统将恢复到低功耗状态运行模式。 4、停止模式(STOP) 停止
[单片机]
STM32MCU电源的低功耗模式
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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