0 通讯基础知识

同步/异步

发送方和接收方按照同一个时钟节拍工作就叫同步。发送方和接收方没有统一的时钟节拍、而各自按照自己的节拍工作就叫异步。
同步通信中,通信双方按照统一节拍工作,所以配合很好;一般需要发送方给接收方发送信息同时发送时钟信号,接收方根据发送方给它的时钟信号来安排自己的节奏。同步通信用在通信双方信息交换频率固定,或者经常通信时。

电平信号/差分信号

概念:
电平信号和差分信号是用来描述信号在通信线路上的描述方式的。也就是说如何在通信线路上表示1和0。
电平信号的传输线中有一个参考电平线(一般是GND),然后信号线上的信号值是由信号线电平和参考电平线的电压差决定。
差分信号的传输线中没有参考电平线,所有都是信号线,然后1和0的表达靠信号线之间的电压差。
优劣:
电平信号的2根通信线之间的电平差异容易受到干扰,传输容易失败;
差分信号不容易受到干扰,因此传输质量比较稳定。现代通信一般都使用差分信号,电平信号几乎没有了。
在相同根数的通信线下,差分信号比电平信号要快,因为差分信号抗干扰能力强,因此1个发送周期更短。

串行接口/并行接口

串行与并行区分的是两种通讯方式在通信时使用的通信线根数
在电平信号下
”1根参考电平线+1根信号线“可以传递1位二进制;
”1根参考电平线+2根信号线“可以同时发送2位二进制;
如果想同时发送8位二进制就需要9根线。

在差分信号下
2根线(彼此差分)可以同时发送1位二进制;
如果需要同时发送8位二进制就需要16根线。

串行接口更加节省信号线,对传输线的要求更加低,成本就更低。
串行通讯可以提高通信速度来提高总体的通讯性能,不一定非要并行


1 串口通讯基础知识

RS232电平和TTL电平

电平信号是用信号线电平减去参考线电平得到的电压差,这个电压差决定了传输值是1还是0。
在电平信号中多少V代表1,多少V代表0是不固定的,取决于电平标准。
RS232电平中-15V ~ -3V表示1,+3V ~ +15V表示0;
TTL电平中+5V表示1,0V表示0。

波特率

波特率,指的是串口通信的速率,也就是串口通信时每秒钟可以传输多少个二进制位
譬如,每秒钟可以传输9600个二进制位(传输一个二进制位需要的时间是1/9600秒,也就是104us),波特率就是9600。
一般情况下波特率越大,整体传输速度就越高。

起始位、数据位、奇偶校验位、停止位

串口通信时,收发是一个周期一个周期进行的,每个周期传输n个二进制位。这一个周期就叫做一个通信单元,一个通信单元由:起始位+数据位+奇偶校验位+停止位组成的。
起始位:表示发送方要开始发送一个通信单元,起始位的定义是串口通信标准事先指定的,是由通信线上的电平变化来反映的。
数据位:是一个通信单元中发送的有效信息位,是本次通信真正要发送的有效数据,串口通信一次发送多少位有效数据是可以设定的(可选的有6、7、8、9,一般都是选择8位数据位,因为一般通过串口发送的文字信息都是ASCII码编码,而ASCII码中一个字符刚好编码为8位)。
校验位:是用来校验数据位,以防止数据位出错的。
停止位:是发送方用来表示本通信单元结束标志的,停止位的定义是串口通信标准事先指定的,是由通信线上的电平变化来反映的。常见的有1位停止位、1.5位停止位、2位停止位等,一般使用的是1位停止位。

单工,半双工,双工

单工:单方向收发数据,譬如,只能A发送数据,B接收数据。
半双工:双方分时收发数据,譬如,“A发送数据,B接收数据”或者“A接收数据,B发送数据”,两个方向不能同时进行。
全双工:双方同时收发数据,譬如,“A发送数据,B接收数据”同时“A接收数据,B发送数据”,两个方向同时进行。


2 串口通讯应用知识

串口通讯需要满足一下几点:
硬件上:
三根通信线是需要的:TX,RX,GND
串口是有线通讯,如果要全双工通讯则三根线都需要。如果要单工通讯则只需要TX/RX中任意一根加上GND
约定上:
串口通信属于基层基本性的通信规约,它自己本身不会去协商通信参数,需要通信前通信双方事先约定好通信参数(一般4个最重要的)


3 串口通讯编程知识

我想根据串口硬件上是否支持FIFO来讲解如果对串口控制器进行编程
有些串口硬件上没有FIFO支持,只有一个数据接收寄存器和一个数据发送给寄存器(这两寄存器有可能都是同一个地址在读写是作为不同角色使用)。
有些串口硬件上支持了FIFO,并支持对其进行配置。

FIFO的支持总的来说是对机器实时性的要求的减轻。不带FIFO的硬件,其每发送或者接收一个字节到发送寄存器时必须等待实际收发完成才能够进行下一个字节的操作。而有FIFO的硬件则不需要这么频繁的跟踪接收/发送寄存器中数据的收发,减少了CPU的占用。

如果硬件上不支持FIFO,机器的计算性能又不够,这种配置下要考虑最坏情况不丢帧有两种方式:

  1. 降低波特率。通讯速率的降低可以缓解处理器和串口控制器对数据寄存器的跟踪频率
  2. 使用DMA模式。DMA模式相当于提供了一个深度可以任意配置的FIFO。同样是115200波特率下,DMA缓冲区设置为128,则Tmax小于11111微秒即可。(数据寄存器轮询的周期不能大于Tmax)

下面的讲解都是基于带FIFO的硬件

发送操作

轮询模式

方法1:
等待发送FIFO空。
写入1字节到发送FIFO。
等待FIFO空,即等待发送完成,返回步骤1再进行一下字节发送。

这种方法基本没有利用FIFO,和使用数据寄存器一个意思,CPU消耗时长等于发送数据在串口上的传输时间,效率最低。

方法2:
等待发送FIFO非满。
写入n字节到发送FIFO,直到FIFO满或无数据可写入。
等待FIFO非满,返回步骤1,如此循环直到无数据可写入。

这种方法的理念就是:FIFO不满就往里面塞,FIFO满了就往外发送,不一定要等发完了才继续塞。

方法3:
等待FIFO非满。
写入n字节到发送FIFO,直到FIFO满或无数据可写入。
等待FIFO空,返回步骤1,如此循环直到无数据可写入。

和方法2类似,FIFO空了才往里面塞,满了就往外发直到发送完

中断模式

有FIFO的串口控制器需要关闭发送完成中断(每发送完成一字节都会触发),打开FIFO空中断。
方法1:
写入1字节到发送FIFO。
等待发送FIFO空中断。
在中断服务函数中,如果是发送FIFO空中断,检测是否还有数据要发送,如果有就继续写入1字节到发送FIFO。如此循环直到数据发送完成。

这种方式其实没有起到FIFO的作用,和无FIFO的效果是一样的,启动时字发送1字节,后续发送都是在中断中进行的,每次发送1字节。不需要循环等待发送完成,CPU主要消耗在中断服务上,且每发一字节就要触发一次中断。

方法2:
写入n字节到发送FIFO,直到FIFO满或无数据可写入。
等待发送FIFO空中断。
在中断服务函数中,如果是发送FIFO空中断,检测是否还有数据要发送,如果有就继续写数据到发送FIFO,直到FIFO满或无数据可写入。如此循环直到数据发送完成。
与方法1相比,利用硬件FIFO的支持,大幅减少了中断触发的次数,从而减少了CPU中断服务时间,提高了效率。这种模式在效率上已近很接近于DMA模式了,而且更通用更容易实现,绝大部分的串口驱动都是这种模式。

方法3:
过程与方法2一样,但触发FIFO空的条件并不是FIFO里的数据已完全传输完成,而是FIFO中剩余的数据小于某长度时(如小于2字节)就触发中断。这样处理会使得中断触发次数略微增加,但保证了在需要满载发送时,在串口线路上数据是一直连续没有中断的。

驱动开发 --- 串口相关推荐

  1. S5PV210开发 -- 串口驱动开发

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78579074 上篇文章讲的 UART,更多的是硬件相关的知识.接下来进入正题 ...

  2. 【正点原子MP157连载】 第十六章 UART串口通信实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  3. 虚拟串口驱动 开发_服务虚拟化如何与测试驱动的开发相关

    虚拟串口驱动 开发 敏捷的软件开发方法依赖于服务虚拟化,以赋予每个IT团队自治权. 这种方法消除了障碍,使自治团队可以继续开发活动,而不必等待任何人. 这样,团队就可以开始迭代/冲刺,从而开始集成测试 ...

  4. WIN10 + VS2015 + WDK10 + SDK10 + VM虚拟机驱动开发调试环境搭建

    为什么80%的码农都做不了架构师?>>>    一.准备工作 1 系统环境:Win10系统 2 开发工具:VS2015 3 驱动开发工具:WDK10 4 Windows SDK:SD ...

  5. 《Android深度探索(卷1):HAL与驱动开发》——1.6节 Linux设备驱动

    本节书摘来自异步社区<Android深度探索(卷1):HAL与驱动开发>一书中的第1章,第1.6节 Linux设备驱动,作者李宁,更多章节内容可以访问云栖社区"异步社区" ...

  6. MF Porting之USB驱动开发

    花费了近三个礼拜的时间,终于完成了TI开发板的USB驱动开发,现在回头想一想,其实也没有什么,具体硬件方面的通信由DM355实现了,软件层面的数据交互由MF Porting实现了,所做的也就是熟悉了解 ...

  7. Windows的驱动开发模型

    在Windows的不同版本上开发的驱动程序"模型"(模型这个词语应该来源于单词"Mode".在Windows NT上,驱动程序被称为Kernel Driver ...

  8. 《Linux设备驱动开发详解 A》一一2.3 接口与总线

    本节书摘来华章计算机出版社<Linux设备驱动开发详解 A>一书中的第2章,第2.3节,作者:宋宝华 更多章节内容可以访问云栖社区"华章计算机"公众号查看.1 2.3 ...

  9. JZ2440驱动开发之环境搭建

    作为Linux驱动开发的小白搭建整个开发环境是至关重要的一步,鄙人是从裸机程序直接跳转到驱动里面来的,裸机到驱动的衔接没怎么看,所以在刚开始驱动的时候搭环境遇到了大麻烦,不过还是在坚持中挺过来了,还得 ...

最新文章

  1. CentOS 8 即将停更,未来我们该何去何从?
  2. php mysql update语句_mysql SELECT FOR UPDATE 语句
  3. mysql double 使用_mysql使用double的坑
  4. oracle rac redo log,RAC共享online redo log和archived log的官方说明
  5. mysql 存储过程临时表_在MySQL存储过程中创建的临时表的范围
  6. istio入门与实战 pdf 下载_Istio入门与实战
  7. 几张图说明男女之间的秘密(ZT)
  8. SCSI硬盘设备到/dev/sd设备的映射关系
  9. CentOS 7:安装网易云音乐
  10. 读书笔记:深度学习入门-基于python的理论与实现(俗称鱼书)
  11. 寻找成功人生的方向-在新东方听讲座的感悟
  12. 设置国内maven镜像仓库
  13. 如何建立团队知识库管理系统,把分散信息有效整理?
  14. 爬去东方财富网龙虎榜(wechat:15353378609)
  15. Python求圆的面积和周长
  16. IntelliJ IDEA 中如何导入jar包(以引入spring包,构建spring测试环境为例)
  17. java quartz 重启不了_java – 重新启动quartz调度程序而不会出现错误
  18. html5游戏开发_HTML5游戏开发–第9课
  19. 蓄电池充放电一体机(铅酸电池组和铁锂电池组)放电、充电、循环充电设备应用
  20. 活动目录 kerberos 身份验证的过程 组策略

热门文章

  1. java for row_Java Row.getRowNum方法代码示例
  2. ubuntu下好用的翻译软件
  3. [Win10] 一键解决Windows10 不能访问局域网的解决方案
  4. 【java】猜字游戏
  5. AutoCAD点击打印就卡死,无响应,没反应的解决办法
  6. 【论文阅读】An Analysis of Scale Invariance in Object Detection – SNIP
  7. 华工计算机高等数学b下作业,华工高等数学下作业
  8. java 世界协调时间格式_Java核心教程之常见时间日期的处理方法
  9. 解决方案 | 亚洲诚信助力互联网行业网络安全建设
  10. 使用jquery做一个简单的当月日历插件