.NET 串口数据接收问题

C#中自带的串口类 

SerialPort

需要添加引用:

using System.IO.Ports;

在数据接收过程中,由于这样或那样的问题,导致从串口发来的数据并不是同时达到的。

因此接收到的数据就不是完整的。为了让数据接收具有完整性,需要在接收数据的方法中进行判断可用数据字节的长度

private void SerialPortOnDataReceived(object sender, SerialDataReceivedEventArgs serialDataReceivedEventArgs)
{
    //假设每次接收的数据长度为60个字节,在此进行判断可用字节的大小,如果小于60不在读取,等到下次在进行读取
    if (_serialPort.BytesToRead < 60)
    {
         return;
    }
    recvSerialPortBytes = new byte[_serialPort.BytesToRead];
    _serialPort.Read(recvSerialPortBytes, 0, recvSerialPortBytes.Length);
}

串口属性 

名称 说明
BaseStream 获取SerialPort对象的基础Stream对象
BaudRate 获取或设置串行波特率
BreakState 获取或设置终端信号状态
BtyesToRead 获取接收缓冲区中数据的字节数
BtyesToWrite 获取发送缓冲区中数据的字节数
CDHolding 获取端口的载波检测行的状态
CtsHolding 获取“可以发送”行的状态
DataBits 获取或设置每个字节的标准数据位长度
DiscardNull 获取或设置一个值,该值指示Null字节在端口或接收缓冲区之间传输时是否被忽略
DsrHolding 获取数据设置就绪(DSR)信号的状态
DtrEnable 获取或设置一个值,该值在串行通信过程中启用数据终端就绪(DTR)信号
Encoding 获取或设置传输前后问呗转换的字节编码
Handshake 获取或设置串行端口数据传输的握手协议
IsOpen 获取一个值,该值指示SerialPort对象的打开或关闭状态
NewLine 获取或设置用户解释ReadLine()和WriteLine()方法调用结束的值
Parity 获取或设置奇偶校验检查协议
ParityReplace 获取或设置一个字节,该字节在发生奇偶校验错误是替换数据流中的无效字节
PortName 获取或设置通信端口,包括但不限于所有可用的COM端口
ReadBufferSize 获取或设置SerialPort输入缓冲区的大小
ReadTimeout 获取或设置读取操作未完成时发生超时之前的毫秒数
ReceivedBytesThreshold 获取或设置DateReceived事件发生前内部输入缓冲区中的字节数
RtsEnable 获取或设置一个值,该值指示在串行通信中是否启用请求发送(RTS)信号
StopBits 获取或设置每个字节的标准停止位数
WriteBufferSize 获取或设置串行端口输出缓冲区的大小
WriteTimeout 获取或设置写入操作未完成时发生超时之前的毫秒数

 串口方法

方法名称 说明
Close 关闭端口连接,将IsOpen属性设置为False,并释放内部Stream对象
Open 打开一个新的串行端口连接
Read 从SerialPort输入缓冲区中读取
ReadByte 从SerialPort输入缓冲区中同步读取一个字节
ReadChar 从SerialPort输入缓冲区中同步读取一个字符
ReadLine 一直读取到输入缓冲区中的NewLine值
ReadTo 一直读取到输入缓冲区中指定value的字符串
Write 已重载,将数据写入串行端口输出缓冲区
WriteLine 将指定的字符串和NewLine值写入输出缓冲区

读取电脑中可用的串口:

//定义一个下拉列表
private System.Windows.Forms.ComboBox CmbPortName;

//! 添加相关串口到下拉列表中
CmbPortName.Items.Clear();
foreach (var name in SerialPort.GetPortNames())
{
    CmbPortName.Items.Add(name);
}
if (CmbPortName.Items.Count > 0)
{
    CmbPortName.SelectedIndex = 0;
}

自定义的Enum

public enum Databits
    {
        FiveBits = 5,
        SixBits = 6,
        SeventBits = 7,
        EightBits = 8
    }

    public enum BaudRates
    {
        BaudRate75 = 75,
        BaudRate110 = 110,
        BaudRate150 = 150,
        BaudRate300 = 300,
        BaudRate600 = 600,
        BaudRate1200 = 1200,
        BaudRate2400 = 2400,
        BaudRate4800 = 4800,
        BaudRate9600 = 9600,
        BaudRate14400 = 14400,
        BaudRate19200 = 19200,
        BaudRate28800 = 28800,
        BaudRate38400 = 38400,
        BaudRate56000 = 56000,
        BaudRate57600 = 57600,
        BaudRate115200 = 115200,
        BaudRate128000 = 128000,
        BaudRate230400 = 230400,
        BaudRate256000 = 256000
    }