问题描述
刚接触串口通讯,习惯了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)。
请与您的供应商核对,看看哪个是正确的。