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缓冲区的更多相关文章
- C#串口SerialPort常用属性方法
SerialPort(): //属性 .BaudRate;获取或设置波特率 .BytesToRead;得到 接收到数据的字节数 .BytesToWrites;得到送往串口的字节数 .DataBits; ...
- (转)C#串口SerialPort常用属性方法
SerialPort(): //属性 .BaudRate;获取或设置波特率 .BytesToRead;得到 接收到数据的字节数 .BytesToWrites;得到送往串口的字节数 .DataBits; ...
- 记一次串口通信调试,慎用SerialPort.Close
做项目是遇到了串口通信,真是遇到了一个大坑,不知道是微软的坑还是我的坑. 让我慢慢道来完整的经历. 项目中以前是vb 写的,是vb与vb 之间进行串口通信,现在改成C#和之前的vb程序进行串口通信. ...
- 串行通讯之.NET SerialPort
第1章串行通讯之.NET SerialPort 2 1 枚举串口 2 2 打开/关闭串口 2 3 写数据 3 3.1 写二进制数据 3 3.2 写文本数据 4 4 ...
- SerialPort使用
1.简介随 着USB的流行,串口通讯已经应用到日常生活的很多方面了,USB是一种高速的串口通讯协议,USB接口非常复杂,通常被用在需要传输大量数据数据的地 方,如U盘.相机.打印机等.除了USB这种较 ...
- c#实现串口操作 SerialPort
命名空间:using System.IO.Ports;该类提供了同步 I/O 和事件驱动的 I/O.对管脚和中断状态的访问以及对串行驱动程序属性的访问. 操作类声明: SerialPort sp = ...
- VB.net 利用SerialPort进行读取串口操作
Imports SystemImports System.IO.Ports Public Class Form1 Private Sub Form1_Load(ByVal sender As Syst ...
- (c#2.0)serialPort串口通讯
原文:(c#2.0)serialPort串口通讯 using System; using System.Collections.Generic; using System.ComponentModel ...
- C# 串口接收数据中serialPort.close()死锁
最近在做一个有关高铁模拟仓显示系统的客户端程序,在这个程序中要运用串口serialPort传输数据,因为每次接收数据结束后要更新UI界面,所以就用到了的Invoke,将更新UI的程序代码封装到一个方法 ...
随机推荐
- Struts05---动态查询
01.在上面案例的login.jsp页面新增 <%-- 2.动态方法的调用 前提是在 struts.xml文件中开启 不推荐! --%> <a href="user/use ...
- python基础之多线程与多进程(二)
上课笔记整理: 守护线程的作用,起到监听的作用 一个函数连接数据库 一个做守护线程,监听日志 两个线程同时取一个数据 线程---->线程安全---->线程同时进行操作数据. IO操作--- ...
- LeetCode OJ:Reverse Linked List II(反转链表II)
Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1-> ...
- 简单使用JDOM解析XML
原文:http://liuwentao.iteye.com/blog/59978 使用JDOM解析XML一.前言JDOM是Breet Mclaughlin和Jason Hunter两大Java高手的创 ...
- react: menuService
1.获取菜单对象 static findCurrentItem(items, currentState, currentItem) { _.forEach(items, function (item) ...
- 如何在JM8.6编码端提取QDCT?
毫无疑问,编码端的QDCT和解码端的QDCT完全相同,下面从编码端提取QDCT. 为简便起见,仅提取第一帧第一个宏块第一个4*4块的QDCT.JM8.6编码器最核心的编码函数是encode_one_m ...
- linux下json库的编译及例程
.下载JsonCpp http://sourceforge.net/projects/jsoncpp/files/ .下载scons http://sourceforge.net/projects/s ...
- ORM 图书管理系统
models.py(模型) from django.db import models # Create your models here. # 书 出版社 作者 作者详情表 # 书 class Boo ...
- 修改CentOS7网卡名称为传统名称eth0格式
1.调整网卡名称 进入网卡目录```[root@tools]# cd/etc/sysconfig/network-scripts/``` 修改名称```[root@network-scripts]# ...
- 创建Oracle数据库需要注意的几点
规划表和存储空间,防止出现空间不足或者空间的浪费 规划快速恢复区,将快速恢复区定义在与数据文件不同的存储区域,减少IO争用 规划数据库的名称,db_name,db_main,sid 规划spfile内 ...