在C#中我们通常使用SerialPort类来对串口进行操作,正常情况下我们只需要将自己的代码写到串口的接收事件中就行,但当串口接收的数据量大的时候有可能出现数据丢失的问题。如果在接收时出现数据丢失的情况,我们可以在接收事件中添加一段延时语句,让程序在收到数据后等一等就可以解决这个问题。

这里贴上对应的代码,其中PortGet方法是串口接收到数据后会执行的方法,我们在这里面加上一句Thread.Sleep(10)就可以有效防止接收到的数据的丢失。

class Program
{
    static SerialPort serialPort;

    static void Main(string[] args)
    {
        serialPort = new SerialPort("COM1");    // 端口
        serialPort.BaudRate = 9600;             // 波特率
        serialPort.Parity = Parity.None;        // 校验位
        serialPort.StopBits = StopBits.One;     // 停止位
        serialPort.DataBits = 8;                // 数据位
        serialPort.ReadTimeout = 1500;
        serialPort.DtrEnable = true;
        serialPort.Encoding = Encoding.UTF8;
        serialPort.ReceivedBytesThreshold = 1;
        serialPort.Open();
        serialPort.DataReceived += new SerialDataReceivedEventHandler(PortGet);
        Console.ReadKey();
    }

    static void PortGet(object sender, SerialDataReceivedEventArgs e)
    {
        int Readlen = serialPort.BytesToWrite;          // 获取接收缓冲区长度            
        byte[] by = new byte[Readlen];                  // 新建一个byte[]数组 用来存放接收的数据
        serialPort.Read(by, 0, Readlen);                // 接收数据到by数组里
        Console.WriteLine(serialPort.ReadExisting());   // 输出
        Thread.Sleep(10);                               // 延时,防止数据丢失
    }
}

 

 
返回顶部