针对zgpswh在串口使用上的一些难题,总结个人在前一阶段的理解,比较片面,不对的地方请高手指正。

1、LPC2000 系列芯片的串口的接收模块包括接收缓冲寄存器和移位寄存器。接收的数据进入移位寄存器后经移位处理并行传入缓冲寄存器,事实上,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就认为一个完整的字符串已经结束了,这才是字符串超时的真正含义。
   
2、为什么要用FIFO呢?我个人觉得,主要是为了提高串口的利用效率,同时可以避免一定程度上的丢包。比如,在用串口发送FIFO中断时,触发深度设为8,那么接收中断发生的条件是,FIFO里有了8个字符,但不是8个字节,因为串口异步通信的协议中,会加帧头和帧尾,但外表上还是以字符为单位。发送时,则是当FIFO里不满8个字符的时候要中断一次,所以利用FIFO发送时也要自建一个用来串口发送的缓冲池,发送中断服务程序里要做的就是从这个发送缓冲区里取数送进FIFO里,沿用上面的假设,触发深度设为8,一次性向FIFO里送15个字符,在送入第一批15个字符之后串口开始自动发送,当FIFO里只有7个字符时,立即发生中断,因此,在发送中断服务程序里要设个计数指针作为跳出中断的上限,这个上限不是8而是15。我认为,如果要发挥fifo的高效率,就必须把自设的缓冲区作成一个环状链表,即,不需要做移位处理使自设的缓冲区剩余的数据顶头。ZLG有详细的基于队列思想的例程。

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)!='\0')
              U0THR = *Str_Send_P++;
              else
              U0IER &= (~0x02);   //关发送中断
              break;
这种做法的道理不太明白,但实验证明,不这么做就只发一次

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liukun321/archive/2010/05/31/5636748.aspx

转载于:https://www.cnblogs.com/jxnclyk/archive/2010/12/31/1923449.html

LPC2000 UART串口使用心得相关推荐

  1. 串口的偶校验位设置_详解UART串口

    通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,通常称作UART) 是一种串行异步收发协议,应用十分广泛.UART工作原理是将数据的二进制位 ...

  2. Android 模拟Uart 串口通信

    下载串口工具 1.下载模拟串口工具:模拟串口工具 模拟串口工具用于生成模拟的两个串口,而不需要真实的物理串口. 2.下载串口调试工具:串口调试工具 串口调试工具用于直接通过串口发送数据 我这里有整合过 ...

  3. Linux uart寄存器读写,Linux下读写UART串口的代码

    Linux下读写UART串口的代码,从IBM Developer network上拿来的东西,操作比較的复杂,就直接跳过了,好在代码能用,记录一下- 两个实用的函数- /** *@brief 设置串口 ...

  4. UART串口通信浅谈之(二)--寄存器设置

    1.1 通信的三种基本类型 常用的通信通常可以分为单工.半双工.全双工通信. 单工就是指只允许一方向另外一方传送信息,而另一方不能回传信息.比如我们的电视遥控器,我们的收音机广播等,都是单工通信技术. ...

  5. UART串口通信浅谈之(一)--基础概述

    通信按照传统的理解就是信息的传输与交换.UART(Universal Asynchronous Receiver/Transmitter,即通用异步收发器)串行通信是单片机最常用的一种通信技术,通常用 ...

  6. NXP(I.MX6uLL) UART串口通信原理————这个未复习

    参考:Linux NXP (I.MX6uLL) UART串口通信原理 作者:一只青木呀 发布时间: 2020-09-20 16:48:33 网址:https://blog.csdn.net/weixi ...

  7. 树莓派UART串口编程--使用wiringPi库-C开发【1-基础应用】

    一.串口说明 莓派3B+上UART串口位于GPIO的8脚和10脚,分别为GPIO8=Tx,GPIO10=Rx.在连接外部接口时,需要交换接口,即GPIO8连接到外设的Rx,GPIO10连接到外设的Tx ...

  8. SJXXX串口扩展芯片 4串口芯片 UART串口芯片

    SJXX串口扩展芯片 1 概述 SJ000是一款具备I2C总线/SPI总线/UART接口的四通道异步收发器件,通过模式选择使得该器件工作于以上任何一种主接口模式下.器件的四个通道UART可提供高达2M ...

  9. STM32 HAL库 UART 串口读写功能笔记

    https://www.cnblogs.com/Mysterious/p/4804188.html STM32L0 HAL库 UART 串口读写功能 串口发送功能: uint8_t TxData[10 ...

最新文章

  1. 实现checkbox的全选和取消
  2. 配置Exchange 2007边缘同步
  3. 2021年7月国产数据库排行榜:openGauss成绩依旧亮眼,Kingbase向Top 10发起冲刺
  4. Web自动化测试中的接口测试
  5. 对JDBC进行简单的封装
  6. (转)C#中 DirectoryEntry组件应用实例
  7. 「程序猿 DD」星球8月拼团活动正式开启!
  8. 教师个人三年发展规划
  9. mac 打开网页慢_老Mac电脑打开网页慢怎么办
  10. 苹果恢复出厂设置系统也会还原吗_刷机、恢复出厂设置和还原设置,你还不知道有什么区别?...
  11. IE浏览器日期转换问题
  12. [HITSC]哈工大2020春软件构造Lab3实验报告
  13. ORACLE OCM备考之外部表管理使用非压缩属性脚本报错KUP-04095与权限
  14. 浏览器环境 兼容运行ES6语法
  15. Thinking -- CSS从根解决选择前一个兄弟元素
  16. 福建厦门计算机春季高考考哪些学校,福建省2020年春季高考总分多少?春季高考本科院校有哪些?...
  17. ES隔断时间会莫名其妙删除索引…………我头上一堆小朋友**喵喵机器人??还是病毒??
  18. 美国推进隐私保护立法 加剧全球网络空间治理复杂性
  19. [物理实验]计算不确定度
  20. 基于 AT89C51 单片机的数字时钟设计

热门文章

  1. LeetCode 1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?(前缀和)
  2. 04.卷积神经网络 W1.卷积神经网络
  3. LeetCode 1561. 你可以获得的最大硬币数目
  4. LeetCode 248. 中心对称数 III(DFS/BFS)
  5. LeetCode 256. 粉刷房子(DP)
  6. 江小白包装设计原型_雪碧和江小白的品牌跨界合作之旅可谓是一场品牌包装的视觉盛宴...
  7. python冒泡算法_python_冒泡算法
  8. linux导出mysql下ssl证书_Linux系统下生成证书 https证书
  9. python中break与continue使用
  10. prompt你到底行不行?