从串口读取数据

5

我是一名新手,对C#和编程一窍不通。

我正在尝试与一个通过USB连接到计算机的欧姆表进行通信。

我能够配置设备并收到数据。但我无法访问这些数据。我只能将其打印到控制台上。(受Microsoft网站上的代码启发)

这是我的“通讯”类构造器,在其中我配置了端口:

public SCPI_Commands()
    {
        _SerialPort.PortName = SetPortName(_SerialPort.PortName);
        _SerialPort.BaudRate = 115200;
        _SerialPort.Parity = Parity.None;
        _SerialPort.DataBits = 8;
        _SerialPort.StopBits = StopBits.One;
        _SerialPort.Handshake = Handshake.None;
        _SerialPort.ReadTimeout = 500;
        _SerialPort.WriteTimeout = 500;
        _SerialPort.Open();
        _SerialPort.DataReceived += _serialPort_DataReceived;
    }

以下是我的函数,用于向设备发送查询指令(常量Measurment_Value代表由我的欧姆表理解的SCPI命令):

public void get_measurement()
    {
        _SerialPort.WriteLine(Measurment_Value);
    }

这里是一个私有函数,用于检查设备是否正在发送数据并将其打印到控制台上(不确定该函数的工作原理):

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        Console.WriteLine(_SerialPort.ReadLine());
    }

很遗憾,我无法将数据返回为字符串。我的目标是对接收到的数据进行一些计算。有人有什么想法吗?
来自德国的问候。
Luke

1
我之前曾经使用过串口......代码在我电脑上,但是我记得我没有发送和接收字符串,而是使用了字节。如果今天晚些时候你还没有有效的答案,我会上传我的方法。 - Shmosi
你的计算结果会发生什么?如果是一个简短的计算,你可以在事件处理程序中执行它。如果是一些长时间运行的计算,你可以启动一个线程。顺便说一下:你既不能依赖于DataReceived事件,也不能依赖于BytesToRead属性。如果你将来想要进行更多的串口工作,我建议你阅读这篇文章这篇文章,特别是评论部分。 - ChristianMurschall
1个回答

5
你可以从缓冲区读取到临时字节数组中,然后将其作为字符串获取,参见下面的示例。将此放置在_serialPort_DataReceived中。
    // this the read buffer
    byte[] buff = new byte[9600];
    int readByteCount = _serialPort.BaseStream.Read(buff, 0, _serialPort.BytesToRead);
    // you can specify other encodings, or use default
    string response = System.Text.Encoding.UTF8.GetString(buff);

旁注

如果您想在使用SerialPort时保持理智,请始终发送和接收字节数组。然后,使用Encoding获取相应的字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接