UART0串口编程系列(三)

发布者:FreeSpirit123最新更新时间:2017-11-28 来源: eefocus关键字:UART0  串口编程 手机看文章 扫描二维码
随时随地手机看文章

一.潜在的危机

1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂。尤其是接收状态为被动状态时,只能靠串行口中断来接收数据。

2.在进行串行通信时,双方遵循相同的通信协议。由于波特率不变,因此相邻两次串口中断的间隔时间基本固定。

3.在以下两种情况时会使接收过程出现错误:

Ø  第一种情况是系统关中断的最长时间大于相邻两次串行接收中断的间隔时间,这时将可能导致遗漏一次中断,造成数据丢失。

²  实时操作系统内核的关中断的最长时间是已知的,通常很短,它不是问题关键。

²  系统关中断的最长时间往往是由用户软件造成的,例如:我们编写的中断服务函数过于复杂,导致系统为了处理中断服务函数而导致关中断时间过长。

Ø  第二种情况是在串口程序正在运行期间有一个比它优先级更高的中断程序中断了串口程序。从而造成数据丢失。

²  在这里提一个概念:把不能响应串口接收中断的这段时间称为“死区”。

²  因此解决问题的关键是:死区时间不能比相邻两次串口中断的间隔时间长。

二.如何解决危机

l  任务在访问比较耗时的共享资源时不要采用关中断的方式(改成互斥信号量)。

l  ISR要尽可能简短,将可以剥离的工作转交关联任务去完成。

(此处的设计方式和Linux中把中断分为上半部分,和下半部分的原理有着同工异曲的含义)

采用上面的方法来缩短死区时间。

另一中方法是:

加长相邻两次串口接收中断的间隔时间。

l  方法一:降低波特率,这个方法简单,但因此也导致通信效率的下将。其次,一般在进行串口编程时,波特率一般是固定的。因此此方法一般不太适用。

l  方法二:在波特率不变的情况下减少中断次数,达到加长相邻两次串口接收中断间隔时间的效果。

ARM芯片的串口具有16字节的缓冲区,可以设置每接收1,4,8,14字节产生一次中断。如果设置每接收8字节中断一次,则比1字节中断一次要延长8倍的中断间隔时间。

Tiger-John说明:

l  在使用有数据缓冲功能的串口编程后,比较容易满足相邻两次串口接收中断的间隔时间大于死区时间的条件,但仍然存在潜在的危险。

想要可靠的避免这场危机:必须要满足以下条件

²  相邻两次串口接收中断的间隔时间必须大于系统死区时间

²  接收缓冲区的空闲时间必须足够存放在“死区”时间内接收到的新数据。

< 若设置每接收8字节中断一次,则空闲空间也为8字节。由于死区时间比中断间隔时间短,故接收的新数据必然少于8字节,才不会出现数据丢失现象。

即在满足中断间隔时间大于“死区”时间的前提下,将中断条件设置为接收缓冲区的1/2,则死区时间接近中断间隔时间,接收过程是可靠的。


关键字:UART0  串口编程 引用地址:UART0串口编程系列(三)

上一篇:UART0串口编程系列(五)
下一篇:UART0串口编程系列(二)

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

C8051f300_UART0串口发送初始化
1、C8051f的UART0是异步、全双工串口。其波特率发生器规定由定时器1 定时器提供。可配置为8位UART或9位UART(多机通讯第九位用于片选作用)。SYSCLK=24.5MHZ(我的板子采用内部晶振频率作为系统时钟) BAUDRATE=115200(波特率) 2、初值TH1 Tl1配置 由上述公式可计算初值: TH1 = 256-(SYSCLK/BAUDRATE/2)而程序内是TH1 = -(SYSCLK/BAUDRATE/2),这两种是相同的。第一种是以正数的二进制形式保存在计算机内。第二种是负数,取反加1求得补码保存在计算机中。结果是相同的。每当TL1中的值溢出后 TH1存储的重装载值装载到TL1中开始计数。
[单片机]
C8051f300_UART0串口发送初始化
UART0串口编程系列(一)
本文章针对的是ARM2200环境下编写串口程序,其中设计轮循方式,中断方式,以及在UC/OS-II操作系统下的串口编程。 使用轮循和中断两种方式来实现串口编程。 (当然了,用中断实现串口编程,系统的效率较高。但是难度也较大 。轮循方式效率较低,但是编程比较简单) 一. 串口编程的硬件原理 1. 串口特性: 1 16字节接收FIFO和16字节发送FIFO 2 接收FIFO触发点可设置为1,4,8或14字节。 3 内置波特率发生器。 2. UART0引脚: 1 RxD0 引脚用于UART0接受数据,接受方式为串行输入。 2 TxD0引脚用于UART0发送数据,发送方式为串行发送数据。 3. UART0的结构和工作
[单片机]
<font color='red'>UART0</font><font color='red'>串口编程</font>系列(一)
ARM7学习---UART0练习
前段时间在练习ARM7的时候遇到一个问题,就是串口通信一直没成功,数据总是出错,好像是波特率没设置好。但是我找了很久都没找出原因。昨天又看数据手册,后来找到了原因,是LPC2103的PLL等时钟没配置好,所以导致了波特率和我设置的不一样。 以下是调试成功的示例程序: /**************ARM7(LPC2103)练习程序**************************/ /*************************************************************/ /*****File Function : UART test *****/ /*****Progr
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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