C# SerialPort 读取命令帮助/解释

问题描述

刚接触串口通讯,习惯了C#,所以我用的是WPF应用来通讯。

我有一个带有设置应用程序和 user manual 的热控制器。

我的任务是编写一个应用程序,该应用程序将发送升高/降低温度的命令。

首先,我想简单地读取设定温度。

在手册的附录 C 中有可用命令的示例。
读取命令 (INPUT1) 示例说“发送”*00010000000041^,我将收到一个类似的字符串,我可以用它来解释控制器的设定温度。

我的问题
我不知道如何正确发送此命令或接收结果!
MainWindow.xaml.cs 实例化一个 Mainviewmodel 对象,这就是我的代码所在的位置。

构造函数

public Mainviewmodel( MainWindow mw ){
        TheMainWindow = mw;
        displayAllPorts();
        SP_COM5 = InitializePort( "COM5" );

        // ReadTemp() is an empty try/catch block right Now. 
        ReadTemp( SP_COM5 );
}

InitializePort 方法:这是有效的,我通过打开和关闭端口进行了测试。

public SerialPort InitializePort( string portName ){
            var baud = 9600;
            var parity = Parity.None;
            var dataBits = 8;
            var stopBits = StopBits.One;

            var port = new SerialPort(portName,baud,parity,dataBits,stopBits);

            port.ReadTimeout = 500;
            port.WriteTimeout = 500;
            port.DataReceived += SP_DataReceived;

            return port;
}

我需要知道的是如何发送读取命令 *00010000000041^
我需要把它转换成字节数组吗?
我会收到一个字符串,还是一系列字节?我知道应该将 DataReceived 事件附加到有问题的 SerialPort 对象。
在这种情况下,正确的 SerialPort 读取方法是什么?

您(个人)如何解释所附手册中的示例?

感谢您的帮助!

解决方法

从我从手册中了解到的,代码是一个ASCII码;

*00010000000041^

如果你拿一个 ASCII 表,你可以找到这些对应的 HEX 值:

'*' : 0x2A    
'0' : 0x30    
'1' : 0x32   
'4' : 0x34  
'^' : 0x5E

结合这给出:2a 30 30 30 31 30 30 30 30 30 30 30 30 34 31 5e 每对 2 代表一个字节,因此您必须将这个字节数组发送到 COM 端口。

你可以像这样得到这个数组:

var bytes = Encoding.ASCII.GetBytes("*00010000000041^");

然后像这样写入串口:

_serialPort.Write(bytes,bytes.Length);

还有一个 _serialPort.WriteLine 接受一个字符串,你可以试试看它是否给出相同的结果。我怀疑是这样。

要读取返回的字节,您可以在 SerialPort.Read(...) 或 DataReceived 事件中执行相反的操作(虽然我认为您只能在那里读取一个字符串,可能这已经是正确的然后格式化):

Encoding.ASCII.GetString(bytes);
,

规范的某些部分不一致。

在附录 C 串行通信中 I. 定义:和 II。示例:(第43-46页),PC端发送的命令以(etx)code(=0x0d)结尾,(ack)code(=0x5e)为设备端发送数据时的代码。

(ack) 是 ^ 作为字符,但 (etx) 没有字符显示并移动到下一行的开头。

然而,在IV中。命令(第47页),PC发送的命令和设备发送的通知的末尾都是(ack)代码(=0x5e)。

请与您的供应商核对,看看哪个是正确的。