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. Flask 分页的简单用法 / flask_sqlalchemy /无刷新翻转页面(原创)

    flask_sqlalchemy对象提供分页方法 1. 后台views代码: from models import <table_name> #导入model的对象 @app.route( ...

  2. 一个css3 DNA 效果

    这个效果就是 不断沿 Y 轴旋转 <div id="container"></div> <style> body{ background:bla ...

  3. 关于linux 编程

    emacs 编辑器 gcc/g++ 编译器 gdb 调试工具 valgrind 内存泄露检查 doxygen 文档组织工具

  4. 目标跟踪之ECO:Efficient Convolution Operators for Tracking

    一. 相关滤波算法总结 作者首先分析了 影响相关滤波算法效率 和 导致过拟合 的几个原因: 1)Model Size (模型大小) 包括两个方面: - 模型层数,对应多分辨率 Sample,比如多层 ...

  5. python 中出现 “IndentationError: expected an indented block” 问题

    python 学习 在定义Python函数的时候如下 >>>def hello() . . .print "hello" 这样会报错的,报错如下: Indenta ...

  6. bzoj 1264 基因匹配

    Written with StackEdit. Description 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的\(DNA\)序列由无数种碱基排列而成(地球上只有\(4\)种) ...

  7. 51nod 1089 最长回文子串 V2(Manacher算法)

    回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. 收起   输入 输入Str(Str的长度 <= 100000) ...

  8. niosii boot过程

    1 概述Nios II 的boot过程要经历两个过程. FPGA器件本身的配置过程.FPGA器件在外部配置控制器或自身携带的配置控制器的控制下配置FPGA的内部逻辑.如果内部逻辑中使用了Nios II ...

  9. js删除局部变量的实现方法

    lert('value:'+str+'\ttype:'+typeof(str)) //声明变量前,引用 var str="dd"; alert('value:'+str+'\tty ...

  10. Asp.Net构架(Http请求处理流程) - Part.1

    引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net.他们耐心.细致地告诉你如何一步步拖放控件.设置控件属性.编写CodeBehind代码,以实现某个特定 ...