SerialPort 写入和读取数据,无需 DataReceived EventHandler

问题描述 投票:0回答:1

我需要处理通过串行端口发送的数据的直接响应并显示结果。我使用SerialPort的DataReceived事件接收不太方便。因为我需要在主窗体内的窗体中处理传入消息,而不是在主窗体上。这就是为什么我必须写作和阅读。但是,写入我使用的代码后,BytesToRead 在 while(serialPort.BytesToRead > 0) 这一步始终返回 0,并且不进入这一步。如果我在开头添加 while(true) ,它会等到超时,有时会读取,但数据会丢失。简单地执行 Serial.write(data,0,data.count) 后如何获得响应?

        newBytetoString = new List<byte>();
        var dataString = "#45M*";
        var data = Encoding.ASCII.GetBytes(dataString);
        

        try
        {
            _serialPort.Write(data.ToArray(), 0, data.ToArray().Count());

            Thread.Sleep(100);
        }
        catch (Exception ex)
        {
            return null;
        }

        try
        {

            byte[] inbuffer = new byte[1];
            List<byte> bytesReceived = new List<byte>();
            List<byte> responseReceived = new List<byte>();

            System.Timers.Timer _responseTimer = new System.Timers.Timer();

            _responseTimer.Interval = 5000;



            _responseTimer.Elapsed += ResponseTimer_Elapsed;
            _responseTimer.AutoReset = false;
            _responseTimer.Start();



            while (!_responseTimedOut)
            {
                
                while (_serialPort.BytesToRead > 0)
                {
                    var byteRead = _serialPort.Read(inbuffer, 0, inbuffer.Length);

                    bytesReceived.Add(inbuffer[0]);
                    responseReceived.Add(inbuffer[0]);


                    Thread.Sleep(5);
                }
                else _responseTimedOut = true;
            }
            _responseTimer.Stop();
            _responseTimedOut = false;

            //_serialPort.Close();
            //_serialPort.Dispose();

            return bytesReceived.ToArray();

        }
        catch (Exception ex)
        {
            return null;
        }
c# serial-port
1个回答
0
投票

如果您不想使用 DataReceived 事件,而只想简单地写入一条消息然后读取,则可以使用类似于以下的代码:

var serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
serialPort.Open();

// Write data to the serial port
string data = "Hello, World!";
serialPort.Write(data);

// Read data from the serial port
string receivedData = serialPort.ReadExisting();
Console.WriteLine($"Received data: {receivedData}");

serialPort.Close();

ReadExisting函数将读取串口输入缓冲区中当前可用的所有数据,并将其作为字符串返回。

如果您在看到数据返回时仍然遇到问题,我会参考您设备上的文档,并确保您已设置正确的 com 端口设置(波特率等)。希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.