SerialPort缓冲区中有:接收缓冲区,发送缓冲区,输入缓冲区,输出缓冲区,传输缓冲区。

例如:

串口属性:BytesToRead(获取接收缓冲区中数据的字节数)--这里提到的是“接收缓冲区”

串口属性:ReadBufferSize(获取或设置 System.IO.Ports.SerialPort 输入缓冲区的大小)---这里提到的是“输入缓冲区”

串口属性:BytesToWrite(获取发送缓冲区中数据的字节数)---这里提到的是“发送缓冲区”

串口属性:WriteBufferSize(获取或设置串行端口输出缓冲区的大小)---这里提到的是“输出缓冲区”

串口属性:DiscardOutBuffer(丢弃来自串行驱动程序的传输缓冲区的数据)---这里提到的是“传输缓冲区”

串口没这么复杂。

收发在最底层是通过2个顺序表模拟的循环队列实现的,你能设置这个队列的长度,我们常用的是2048或4096,2048足够用,4096是正好内存一页长度,分配一整张页表。

不过这都扯远了。.net下使用SerialPort你可以忽略这些。那些系统的缓冲区存在的目的是将流数据缓存下来,因为串口作为一种流设备,硬件,驱动层实际上是逐个字节发送的,但你的应用软件这么做却很麻烦,那么及时的处理串口收发也不现实,所以,操作系统创建一个缓冲区,用于将你写串口的数据缓存起来,例如你调用写串口后,系统将你传递的数据复制到发送队列,排队发送,并立刻返回避免你的软件卡住。接受部分,则是在你的软件调用Read方法之前,如果有数据来,系统将数据保存在接收的队列中,当你调用Read时,一次性将缓存数据读出给你,并清空缓存。

并没有那么多的缓存,你看系统的丢弃缓存功能,也只有in和out。(DiscardInBuffer/DiscardOutBuffer)

因为串口的流特性,缓冲区内存储了多少数据是动态变化的,你可以通过BytesToRead属性获取当前的有效字节数。

接收缓冲区与输入缓冲区的区别可能想表达的就是BytesToRead是有效数据长度,ReadBufferSize表示接收队列的长度。BytesToRead总小于或等于ReadBufferSize。

写和读一样理解。

DiscardOutBuffer的意思是将正在发送的队列中数据清空。

另外,我上面描述的未必就是底层真实的行为,只是大概,因为串口的驱动是可以自己写,自己实现的,大概原理是这样,但也不排除有人实现串口驱动时自己创造几个队列来分别存储以上你描述的内容,这个只和具体驱动实现有关。

而我们的.net/api的意义就是让你忽略这些细节,只理解接口意义,串口流设备的意义。

 
0

SerialPort缓冲区的更多相关文章

  1. C#串口SerialPort常用属性方法

    SerialPort(): //属性 .BaudRate;获取或设置波特率 .BytesToRead;得到 接收到数据的字节数 .BytesToWrites;得到送往串口的字节数 .DataBits; ...

  2. (转)C#串口SerialPort常用属性方法

    SerialPort(): //属性 .BaudRate;获取或设置波特率 .BytesToRead;得到 接收到数据的字节数 .BytesToWrites;得到送往串口的字节数 .DataBits; ...

  3. 记一次串口通信调试,慎用SerialPort.Close

    做项目是遇到了串口通信,真是遇到了一个大坑,不知道是微软的坑还是我的坑. 让我慢慢道来完整的经历. 项目中以前是vb 写的,是vb与vb 之间进行串口通信,现在改成C#和之前的vb程序进行串口通信. ...

  4. 串行通讯之.NET SerialPort

    第1章串行通讯之.NET SerialPort    2 1 枚举串口    2 2 打开/关闭串口    2 3 写数据    3 3.1 写二进制数据    3 3.2 写文本数据    4 4 ...

  5. SerialPort使用

    1.简介随 着USB的流行,串口通讯已经应用到日常生活的很多方面了,USB是一种高速的串口通讯协议,USB接口非常复杂,通常被用在需要传输大量数据数据的地 方,如U盘.相机.打印机等.除了USB这种较 ...

  6. c#实现串口操作 SerialPort

    命名空间:using System.IO.Ports;该类提供了同步 I/O 和事件驱动的 I/O.对管脚和中断状态的访问以及对串行驱动程序属性的访问. 操作类声明: SerialPort sp = ...

  7. VB.net 利用SerialPort进行读取串口操作

    Imports SystemImports System.IO.Ports Public Class Form1 Private Sub Form1_Load(ByVal sender As Syst ...

  8. (c#2.0)serialPort串口通讯

    原文:(c#2.0)serialPort串口通讯 using System; using System.Collections.Generic; using System.ComponentModel ...

  9. C# 串口接收数据中serialPort.close()死锁

    最近在做一个有关高铁模拟仓显示系统的客户端程序,在这个程序中要运用串口serialPort传输数据,因为每次接收数据结束后要更新UI界面,所以就用到了的Invoke,将更新UI的程序代码封装到一个方法 ...

随机推荐

  1. ARM体系结构总结

    特殊功能寄存器与外设绑定,通用寄存器是与CPU绑定. ARM是RISC架构 常用ARM汇编指令只有二三十条 ARM是低功耗CPU ARM的架构非常适合单片机.嵌入式.尤其是物联网领域:而服务器等高性能 ...

  2. 《转》 EJB到底是什么,真的那么神秘吗??

    1. 我们不禁要问,什么是"服务集群"?什么是"企业级开发"? 既然说了EJB 是为了"服务集群"和"企业级开发",那么 ...

  3. 20165210 2017-2018-2《Java程序设计》课程总结

    20165210 2017-2018-2<Java程序设计>课程总结 每周作业链接汇总: 预备作业一: 20165210 我期望的师生关系 预备作业二:20165210 学习基础和C语言基 ...

  4. Arcgis for JS扩展GraphicLayer实现区域对象的聚类统计与展示

    功能需求: 分省市统计并展示全国雨量站的数目与位置. 常规做法: 分省市雨量站的数目通过统计表的形式在页面端展示,位置根据XY坐标信息将雨量站标绘在图上. 优化做法: 去掉统计图的展示方式,直接将各省 ...

  5. 移动元素时,translate要比margin好

    比如 做全屏轮播时,父元素往往是被子元素撑起来的,那你设置父元素的margin时,往往会感染到子元素,如下图: 而用translate3d就不会出现这种效果:

  6. virtual box 安装 centos 7 不能上网问题解决总结

    http://blog.csdn.net/u013264730/article/details/51146359 1.设置virtualbox 网络选项 [root@centos1 ~]# cat / ...

  7. Windows GVLK密钥对照表(KMS激活专用

    以下key来源于微软官网:https://technet.microsoft.com/en-us/library/jj612867.aspx Windows Server 2016 操作系统 KMS激 ...

  8. tslib: Selected device is not a touchscreen (must support ABS_X and ABS_Y events)

    /************************************************************************************ * tslib: Selec ...

  9. LINUX系统yum安装SVN服务及其配置

    待: http://oplinux.com/app/svn/linux-yum-install-svn.html  //基础设置及流程 http://files.cnblogs.com/logon/s ...

  10. Python之属性、特性和修饰符

    作为面对对象的核心内容,将从以下一个方面进行总结: 1. property和@property 2. __getattribute__().__getattr__().__setattr__().__ ...