串口FIFO中断有;RDA CTI
串口的接收模块包括接收缓冲寄存器和移位寄存器。接收的数据进入移位寄存器后经移位处理并行传入缓冲寄存器,事实上,UART的FIFO是一个硬件环形的缓冲队列,物理上不可寻址,不可见,仅U0RBR这个FIFO出口可见。U0RBR就是接收FIFO的第一位。FIFO的长度是可设的,也叫触发点,低于这个长度的字符串不会引起中断,但在实际应用中,不可能串口读入的数据长度总为触发点值的整数倍,为此,引入了CTI即字符接收超时中断,当有不足触发点值规定的字符串读入时,将引起中断,其与串口的RDA中断具有相同的优先级,并会同时被使能。
那么,LPC2000的UART机制是如何判断串口读入数据的一次性容量呢?如果接收FIFO里已经有了1个字符,它可在一定的时间内等待下一个字符的读入,也就是说,不超过一定的时间就不会触发CTI中断,这个时间是在本次通讯协议设置的前提下,接收3.5到4.5个字符所用的时间。比如,需串口接收GPRS数传状态成功建立后的返回值“Ok_Info_WaitingForData”22个字符组成的字符串,FIFO触发点设置为14,在前14个字符读入之后,立即触发RDA中断(接收中断),跳转至RDA中断服务子程序将这14个字符放入我所预设的缓冲区内,接着,后8个字符读入,这时CPU并不立刻中断,它需等待在本次串口通讯协议设置的前提下,接收3.5到4.5个字符所用的时间(需根据波特率和帧格式具体计算),这个时间一到,立刻触发CTI中断(超时中断),换句话说,超过这个时间的等待,CPU就认为一个完整的字符串已经结束了,这才是字符串超时的真正含义。
CTI触发的前提是接收FIFO里已经有了1个字符,在等待下一个字符的进入
用FIFO发送数据时,需要保证接受端的FIFO不溢出,则发送过快,接受端FIFO满后中断末取走数据,发送端就又发数据。其只能由发送端来保证
不过接受端FIFO有2个Buffer,循环接收.
3、个人觉得,当FIFO的触发深度设为1时和不用FIFO时的效果是一样的。
4、串口发送时,推荐第一个字符要在打开串口中断前送(不懂???),否则可能中断只来一次。比如下面的这个用串口中断发送字符串的函数为:
/******************************************************
** 函数名称 :UART0_SendStr()
** 函数功能 :向串口发送字符串
** 入口参数 :str 要发送的字符串的首地址指针
** 出口参数 :无
*******************************************************
void UART0_SendStr( CHAR const *str)
{
Str_Send_P = str;
U0THR = *Str_Send_P++;
U0IER |= 0x02; //开发送中断
}
在中断发送程序中的处理为:
SWITCH(IIR & 0x0e)
{
case 0x02: //利用串口发送中断,发送字符串
if((*Str_Send_P)!='')
U0THR = *Str_Send_P++;
else
U0IER &= (~0x02); //关发送中断
break;
这种做法的道理不太明白,但实验证明,不这么做就只发一次!~
关键字:串口 FIFO中断 字符串
引用地址:
关于串口FIFO中断
推荐阅读最新更新时间:2024-03-16 13:21
AVR和51单片机串口通信简单实验
//AVR作为发送机,控制51的喇叭发声和2 极管 发光 //AVR发送方代码 //采用2400波特率 #include iom16.h #include intrinsics.h #define uchar unsigned char #define uint unsigned int #define k1 PIND_Bit4 //设置为喇叭 #define k3 PIND_Bit6 //设置为 发光 管 #define k4 PIND_Bit7 //发送控制命令 #define UDRE 5 #define RXC 7 uchar dat=48; void d
[单片机]
利用SPComm 控件实现的PC 机与单片机串口通讯
1.引言 随着计算机网络通讯与信息技术的高速发展,采用PC与多台单片机构成的分布式系统、工业控制系统、数据传输系统等越来越受到广泛应用。下位机采用运行性能较为可靠的单片机,直接对所控制对象进行实时数据的采集、计算、判断和处理;而上位机则多采用PC机(如Pentium 系列),主要负责对各单片机进行综合管理,以实现测控系统的自动检测与控制。在这类应用系统中,稳定可靠、方便快捷的数据通信是实现应用系统功能的基础和保障。因此,如何根据系统的实际工作环境条件,选择恰当的通信接口和协议,合理设计通信软件和硬件控制电路以获得高可靠性,强抗干扰和容错能力成为衡量此类系统好坏的最重要因素。 本文以某一工程项目通讯系统为例,介绍一种基于Delp
[单片机]
MSP432P401R TI Drivers 库函数学习笔记(六)UART 串口
平台:Code Composer Studio 10.4.0 MSP432P401R SimpleLink™ 微控制器 LaunchPad™ 开发套件 (MSP-EXP432P401R) API (机翻) 官方UART API 手册 void UART_close (UART_Handle handle) 关闭由UART句柄指定的UART外围设备 int_fast16_t UART_control (UART_Handle handle, uint_fast16_t cmd, void *arg) 在给定的UART_Handle上执行实现特定的特性 void UART_init (void) 初始化UA
[单片机]
串口的波特率实测【多图】
在使用串口的时候,串口的波特率是一个必须给定的参数。虽然书上说的很明确了,是一bit的时间。可我就是不放心,一直纳闷这个波特率到底是发送方波的频率还是发送一个字节所需要的时间。今天专门测试下,留作备案以免以后再疑惑。 实验方法:串口以各种波特率发送数据,用示波器查看并测量。 实验的硬件:STM32F4Discovery 的USART3 实验方法:将板子上的串口初始化之后,循环发送数据: while(1) { USART_SendData(USART3,0xAA); } 之后每测量一次改一次波特率。串口初始化的方法,可参考 USART1 Init 各种波特率下的实测 9600 14400 19200
[单片机]
AVR USART串口程序
usart简介: 通用同步和异步串行接收器和转发器(USART) 是一个高度灵活的串行通讯设备。主要特点为: 全双工操作( 独立的串行接收和发送寄存器) 异步或同步操作 主机或从机提供时钟的同步操作 高精度的波特率发生器 支持5, 6, 7, 8, 或9 个数据位和1 个或2 个停止位 硬件支持的奇偶校验操作 数据过速检测 帧错误检测 噪声滤波,包括错误的起始位检测,以及数字低通滤波器 三个独立的中断:发送结束中断, 发送数据寄存器空中断,以及接收结束中断 多处理器通讯模式 倍速异步通讯模式 数据读写 官方解释 USART的初始化 void USART_Init( unsigned int baud ) { /* 设置波特
[单片机]
STM32:DMA实例之串口(USART)通信
硬件平台:stm32f10xZET6 开发环境:keil MDK uVision v4.10 开发语言:C、ST_lib_3.5固件库 /* 代码演示 main.c */ #include stm32f10x.h #include bsp_usart1.h #include bsp_led.h extern uint8_t SendBuff ; static void Delay(__IO u32 nCount); /** * @brief 主函数 */ int main(void) { /* USART1 config 115200 8-N-1 */ USART1_Config(); USART1_
[单片机]
stm32 串口通信数据乱码
最近在写stm32的标准库的串口通讯程序,本来很简单的串口通讯,却硬生生被上位机接收到乱码的问题折磨了好久,反复百度了好几次,始终没搜到正确解决方法,不过最后终于在https://www.eeworld.com.cn/mcu/2018/ic-news081240692.html这篇帖子上找到了答案。虽然最后问题和这位大佬不太一样,但是我也是它列出的几个情况之一——外部时钟问题。正如这位大佬所说,串口通信用的是外部时钟,而在stm32f10x.h/stm32f4xx.h中的HSE的设置值HSE_VALUE默认是25MHz。因为官方的开发板是用的25MHz,但是有些开发板用的是8MHz,所以这个地方没改的话就可能出现乱码。我把这里一改,
[单片机]
三种方式解决USB接口与串口设备之间互连问题
由于USB接口具有即插即用的特性,现已出现只有USB口而没有传统接口的PC,那么在这样的计算机上如何使用旧式基于串行接口的设备呢?本文介绍了三种方法,并对各自的优缺点进行了详细的讨论。
过去PC用户在接入新设备时还需要安装相应的驱动程序,对于非专业用户来讲不仅麻烦而且容易出错,他们一直希望在连接新外设时能减少这些让人困惑的难题。通过去除串口、并口以及PS2口等老式端口,然后用诸如USB之类即插即用端口加以替代,最终用户现在终于能够体验到这一方面的显著改善(图1)。
USB为消费类电子产品提供了轻松的扩展功能,许多设备操作系统本身就可以提供支持,不要求外设开发人员提供驱动程序,从而使添加外设变得更为简单。同
[嵌入式]