串口通信(3)-C#串口类SerialPort详解
本文详解C#串口类SerialPort
目录
一、概述
从.NET Framework 2.0开始,C#提供了SerialPort类用于实现串口控制,使用简单方面。
命名空间:System.IO.Ports
程序集:System.IO.Ports.dll
包:System.IO.Ports v8.0.0
二、构造函数及重载
1、SerialPort()
初始化SerialPort类的新实例。
2、SerialPort(IContainer)
使用指定的IContainer对象初始化SerialPort类的新实例。
3、SerialPort(String)
使用指定的端口名称初始化SerialPort类的新实例。
4、SerialPort(String, Int32)
使用指定的端口名称和波特率初始化SerialPort类的新实例。
5、SerialPort(String, Int32, Parity)
使用指定的端口名称、波特率和奇偶校验位初始化SerialPort类的新实例。
6、SerialPort(String, Int32, Parity, Int32)
使用指定的端口名称、波特率、奇偶校验位和数据位初始化SerialPort类的新实例。
7、SerialPort(String, Int32, Parity, Int32, StopBits)
使用指定的端口名称、波特率、奇偶校验位、数据位和停止位初始化SerialPort类的新实例。
三、字段InfiniteTimeout
public const int InfiniteTimeout = -1;
此值与?ReadTimeout?和?WriteTimeout?属性一起使用。
如果ReadTimeout?和?WriteTimeout?属性设置为-1,就是一直等待
常用的属性、方法及事件
四、属性
1、BaseStream?获取SerialPort?对象的基础Stream?对象
用于显式异步 I/O 操作,即多线程方式操作串口
2、BaudRate?获取或设置串行波特率
默认值9600,比特率=波特率X单个调制状态对应的二进制位数。
3 BreakState?获取或设置中断信号状态
如果端口处于中断状态,则为?true;否则为?false。
4、BytesToRead?获取接收缓冲区中数据的字节数
5、BytesToWrite?获取发送缓冲区中数据的字节数
6、CDHolding?获取端口的载波检测行的状态
此属性可用于监视端口的载波检测行的状态。无载波通常表明接收方已挂断且载波已被丢弃。
7、CtsHolding?获取“可以发送”行的状态
在请求发送/可以发送 (RTS/CTS) 硬件握手中使用可以发送 (CTS) 行。发送数据之前端口会查询 CTS 行。
8、DataBits?获取或设置每个字节的标准数据位长度
默认值8?当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
9、 DiscardNull?获取或设置一个值,该值指示Null?字节在端口和接收缓冲区之间传输时是否被忽略
默认值false正常情况下,特别是对于二进制传输而言,此值应该设置为 false。将此属性设置为 true 会使 UTF32 和 UTF16 编码字节产生意外结果。
10、DsrHolding?获取数据设置就绪(DSR)?信号的状态
在数据设置就绪/数据终端就绪 (DSR/DTR) 握手中使用此属性。通常由调制解调器将数据设置就绪 (DSR) 信号发送到端口,以表明它已经为数据传输或数据接收做好准备。
11、DtrEnable?获取或设置一个值,该值在串行通信过程中启用数据终端就绪(DTR)?信号
默认值 false在 XON/XOFF 软件握手、请求发送/可以发送 (RTS/CTS) 硬件握手和调制解调器通信的过程中通常启用数据终端就绪 (DTR)。
12、Encoding?获取或设置传输前后文本转换的字节编码?默认为 ASCIIEncoding
不提供错误检测。出于安全原因,建议您使用 UTF8Encoding、UnicodeEncoding 或 UTF32Encoding 并启用错误检测。ASCIIEncoding 仅支持 U+0000 和 U+007F之间的 Unicode 字符值。因此,UTF8Encoding、UnicodeEncoding 和 UTF32Encoding 可以更好地适应全球化的应用程序。
13、Handshake???获取或设置串行端口数据传输的握手协议
默认值None使用握手时,将指示连接到 SerialPort 对象的设备在缓冲区中至少有 (ReadBufferSize-1024) 个字节时停止发送数据。当缓冲区中的字节数小于等于 1024 时,将指示设备重新开始发送数据。如果设备在大于 1024 个字节的块中发送数据,可能会导致缓冲区溢出。如果将 Handshake 属性设置为 RequestToSendXOnXOff 并将 CtsHolding 设置为 false,则不会发送 XOff 字符。如果后来将 CtsHolding 设置为 true,则必须发送更多的数据后才会发送 XOff 字符。
14、IsOpen???获取一个值,该值指示?SerialPort?对象的打开或关闭状态???
15、NewLine???获取或设置用于解释?ReadLine(?)和WriteLine(?)方法调用结束的值?
默认值“\n”
16、Parity???获取或设置奇偶校验检查协议
默认值None?在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。
17、ParityReplace???获取或设置一个字节,该字节在发生奇偶校验错误时替换数据流中的无效字节?
18、PortName???获取或设置通信端口,包括但不限于所有可用的?COM?端口??
默认值COM1,串口对于操作系统来说是一个文件,如果设置PortName为本机不存在的串口名(即文件名),如“COM7”或“COMK”,Open()打开串口将失败,提示“端口COM7不存在”。
19、ReadBufferSize???获取或设置?SerialPort?输入缓冲区的大小???
默认值4096?ReadBufferSize 属性忽略任何小于 4096 的值,由于 ReadBufferSize 属性只表示 Windows 创建的缓冲区,而 BytesToRead 属性除了表示 Windows 创建的缓冲区外还表示 SerialPort 缓冲区,所以 BytesToRead 属性可以返回一个比 ReadBufferSize 属性大的值。
20、ReadTimeout?获取或设置读取操作未完成时发生超时之前的毫秒数?
默认值-1?超时为无穷大。
确切的说ReadTimeout设置了Read(outBuf, offset, count)超时等待的时间,即如果接收缓冲区一直没有数据,则Read()等待ReadTimeout毫秒后甩TimeoutException异常。但是在ReadTimeout期间,只要有一个数据,则Read()立马返回,而不是等待count个字节数据。?
用WriteLine()来发送数据,用ReadLine()来读取数据。WriteLine发送完数据后,会将换行符作为数据也发送给对方。ReadLine()读取数据时,直至遇到一个换行符,然后返回一个字符串代表一行信息。换行符可以通过SerialPort 的属性NewLine来设置。ReadLine()方法是阻塞的,直至遇到一个换行符后返回。在读取数据时,如果一直没有遇到换行符,那么在等待ReadTimeout时间后,抛出一个TimeoutException。默认情况下,ReadTimeout为InfiniteTimeout。这样,ReadLine一直处于阻塞状态,直至有新一行数据到达。同理,WriteLine()也是如此。WriteLine()方法也是阻塞的,如果另一方不能及时接收数据,就会引起TimeoutException异常。
ReadTimeOut的意思是从有数据开始,读取的时间超过这个设置的值,则引发异常,比如是某些驱动级原因导致读取时间过长导致的,并不是说ReadByte,ReadTo,ReadLine的超时时间,这些方法本身是一定会同步阻塞等结果。
因此,在读写时,有可能超时,需要设定超时时间,读取超时值在 Win32 通信 API 中最初被设置为 500 毫秒。此属性允许您设置此值。可以将超时值设置为大于零的任意值,或设置为 InfiniteTimeout,在后一种情况下不会发生超时。InfiniteTimeout 为默认值。
21、ReceivedBytesThreshold???获取或设置?DataReceived?事件发生前内部输入缓冲区中的字节数???
22、RtsEnable???获取或设置一个值,该值指示在串行通信中是否启用请求发送?(RTS)?信号
默认值false请求发送 (RTS) 信号通常用在请求发送/可以发送 (RTS/CTS) 硬件握手中。
23、StopBits???获取或设置每个字节的标准停止位数
默认值One?用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
24、WriteBufferSize?获取或设置串行端口输出缓冲区的大小???
25、WriteTimeout???获取或设置写入操作未完成时发生超时之前的毫秒数
默认值-1写入超时值在 Win32 通信 API 中最初被设置为 500 毫秒。此属性允许您设置此值。此值可以设置为 0 以立即从写入操作返回,或设置为任意正值,也可以设置为默认的 InfiniteTimeout。此属性不影响 BaseStream 的 BeginWrite 方法。
五、方法
1、Open() 打开一个新的串行端口连接
2、Close() 关闭端口连接,将 IsOpen 属性设置为 false,并释放内部 Stream 对象
3、Read(Byte[], int, int) 输入缓冲区读取一些字节并将那些字节写入字节数组中指定的偏移量处
4、ReadByte() 从 SerialPort 输入缓冲区中同步读取一个字节
5、ReadChar() 从 SerialPort 输入缓冲区中同步读取一个字符
6、ReadExisting() 在编码的基础上,读取 SerialPort 对象的流和输入缓冲区中所有立即可用的字节
7、ReadLine() 一直读取到输入缓冲区中的 NewLine 值
8、ReadTo() 一直读取到输入缓冲区中的指定 value 的字符串
9、Write(string) 将指定的字符串写入串行端口
10、Write(Byte[], int, int) 使用缓冲区的数据将指定数量的字符写入串行端口
11、WriteLine() 将指定字符串和NewLine值写入输出缓冲区
12、DiscardInBuffer() 丢弃接收缓冲区的数据
13、DiscardOutBuffer() 丢弃发送缓冲区的数据
14、static GetPortNanes() 获取当前计算机的串口名称数组
六、事件
1、DataReceive事件 数据接收事件的方法
不保证对接收到的每个字节引发 DataReceived 事件。 使用 BytesToRead 属性确定缓冲区中剩余的要读取的数据量。从 SerialPort 对象接收数据时,将在辅助线程上引发 DataReceived 事件。
2、PinChanged事件 串行管脚更改事件的方法
在 SerialPort 对象进入 BreakState 时引发,但在端口退出 BreakState 时不引发。将在辅助线程上引发 PinChanged 事件。
3、ErrorReceived事件 错误事件的方法
如果在流的尾字节上出现奇偶校验错误,将向输入缓冲区添加一个值为 126 的额外字节。将在辅助线程上引发 ErrorReceived事件。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!