串口设置 "TxContinueOnXoff" 等等。 Delphi 到 C#
Serial port settings "TxContinueOnXoff" and a few more. Delphi to C#
我正在用 C# 编写软件来对具有 TX 和 RX 频率以及可选信息的双向无线电进行编程。制造程序是用 Delphi 编写的。我有来自制造商的 HEX 协议信息,但我必须反编译他们的程序才能获得其他信息。现在我只是构建了一个简单的程序来发送一个字符串并读取无线电回复。
我向收音机发送启动字符串,它以疯狂的方式响应“-P320733?-”。然后我向它发送另一个字符串以启动频道信息,它给出了 "W???????????"。 W 是正确的,但 ?s 不是,据我了解,这可能是串行端口配置错误的结果。
由于原始程序是用Delphi编写的,所以我不知道某些设置是什么,也不知道在 C# 中将它们设置成什么。
这是Delphi端口设置。其中的大多数内容都是不言自明的,而其他内容则不是。我不确定 是否需要设置以及它们需要如何设置以及我可以忽略的部分。
CommName = 'COM2'
BaudRate = 9600
ParityCheck = False
Outx_CtsFlow = False
Outx_DsrFlow = False
DtrControl = DtrEnable
DsrSensitivity = False
TxContinueOnXoff = True
Outx_XonXoffFlow = False
Inx_XonXoffFlow = False
ReplaceWhenParityError = False
IgnoreNullChar = False
RtsControl = RtsEnable
XonLimit = 500
XoffLimit = 500
ByteSize = _8
Parity = None
StopBits = _2
XonChar = #17
XoffChar = #19
ReplacedChar = #0
ReadIntervalTimeout = 20
ReadTotalTimeoutMultiplier = 0
ReadTotalTimeoutConstant = 0
WriteTotalTimeoutMultiplier = 0
WriteTotalTimeoutConstant = 0
OnReceiveData = Comm1ReceiveData
这是我的端口代码。
{
InitializeComponent();
serialPort1.PortName = "COM1";
serialPort1.BaudRate = 9600;
serialPort1.DtrEnable = true;
serialPort1.RtsEnable = true;
serialPort1.StopBits = StopBits.Two;
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
}
我向它发送下面的代码,它向我发送“-P320733?-”。它应该 return 0650333230373333FF06.
byte[] juf = new byte[9];
j = 0;
juf[j++] = (byte)0x50; //start talking to radio
juf[j++] = (byte)0x52;
juf[j++] = (byte)0x4f;
juf[j++] = (byte)0x47;
juf[j++] = (byte)0x52;
juf[j++] = (byte)0x41;
juf[j++] = (byte)0x4D;
juf[j++] = (byte)0x02;
juf[j++] = (byte)0x06;
收音机响应后,我将下面的代码发送给它并返回 "W?????????"。 ?s 的数量从 0 到 20 不等。它应该 return 与“57004040”和“0075024000750240FFFFFFFF00BFA0F8”。
byte[] vuf = new byte[5];
v = 0;
vuf[v++] = (byte)0x52; //start channel info
vuf[v++] = (byte)0x00;
vuf[v++] = (byte)0x40;
vuf[v++] = (byte)0x40;
vuf[v++] = (byte)0x06;
最终我需要将收音机的响应转换为可读信息并将其显示在数据网格视图上以供用户查看,但那是稍后的事,现在我只是想确保连续剧播放良好。
关于通讯参数,你已经正确设置了。 TxContinueOnXoff
参数应该没有意义,因为 Xon/Xoff flow control
设置为 false
。
您需要区分字节值的 ASCII 表示和 HEX 表示。 Ascii table
如果文档使用十六进制表示发送和接收的数据,您应该将文档与 实际数据作为十六进制表示,而不是文本进行比较。
如果以十六进制形式查看,似乎第一个响应确实与文档匹配。当记录的十六进制表示被转换为 ASCII(不可打印字符 0x06 和 0xFF 除外)时,它与您调用 'something crazy'.
相同
HEX: 06 50 33 32 30 37 33 33 FF 06 // expected, as hex
ASCII: - P 3 2 0 7 3 3 ? - // received, as text
0x06 和 0xFF 没有可打印字符,因此,无论您以前将消息视为文本,还是选择将 0x06
显示为破折号,将 0xFF
显示为问号。
只需将字节视为字节 - 字节,并使用文档将十六进制表示形式转换为 compare/verify。
只是好奇,这个协议叫什么,或者如果它是公开的,你有 link 分享吗?
我正在用 C# 编写软件来对具有 TX 和 RX 频率以及可选信息的双向无线电进行编程。制造程序是用 Delphi 编写的。我有来自制造商的 HEX 协议信息,但我必须反编译他们的程序才能获得其他信息。现在我只是构建了一个简单的程序来发送一个字符串并读取无线电回复。
我向收音机发送启动字符串,它以疯狂的方式响应“-P320733?-”。然后我向它发送另一个字符串以启动频道信息,它给出了 "W???????????"。 W 是正确的,但 ?s 不是,据我了解,这可能是串行端口配置错误的结果。
由于原始程序是用Delphi编写的,所以我不知道某些设置是什么,也不知道在 C# 中将它们设置成什么。
这是Delphi端口设置。其中的大多数内容都是不言自明的,而其他内容则不是。我不确定 是否需要设置以及它们需要如何设置以及我可以忽略的部分。
CommName = 'COM2'
BaudRate = 9600
ParityCheck = False
Outx_CtsFlow = False
Outx_DsrFlow = False
DtrControl = DtrEnable
DsrSensitivity = False
TxContinueOnXoff = True
Outx_XonXoffFlow = False
Inx_XonXoffFlow = False
ReplaceWhenParityError = False
IgnoreNullChar = False
RtsControl = RtsEnable
XonLimit = 500
XoffLimit = 500
ByteSize = _8
Parity = None
StopBits = _2
XonChar = #17
XoffChar = #19
ReplacedChar = #0
ReadIntervalTimeout = 20
ReadTotalTimeoutMultiplier = 0
ReadTotalTimeoutConstant = 0
WriteTotalTimeoutMultiplier = 0
WriteTotalTimeoutConstant = 0
OnReceiveData = Comm1ReceiveData
这是我的端口代码。
{
InitializeComponent();
serialPort1.PortName = "COM1";
serialPort1.BaudRate = 9600;
serialPort1.DtrEnable = true;
serialPort1.RtsEnable = true;
serialPort1.StopBits = StopBits.Two;
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
}
我向它发送下面的代码,它向我发送“-P320733?-”。它应该 return 0650333230373333FF06.
byte[] juf = new byte[9];
j = 0;
juf[j++] = (byte)0x50; //start talking to radio
juf[j++] = (byte)0x52;
juf[j++] = (byte)0x4f;
juf[j++] = (byte)0x47;
juf[j++] = (byte)0x52;
juf[j++] = (byte)0x41;
juf[j++] = (byte)0x4D;
juf[j++] = (byte)0x02;
juf[j++] = (byte)0x06;
收音机响应后,我将下面的代码发送给它并返回 "W?????????"。 ?s 的数量从 0 到 20 不等。它应该 return 与“57004040”和“0075024000750240FFFFFFFF00BFA0F8”。
byte[] vuf = new byte[5];
v = 0;
vuf[v++] = (byte)0x52; //start channel info
vuf[v++] = (byte)0x00;
vuf[v++] = (byte)0x40;
vuf[v++] = (byte)0x40;
vuf[v++] = (byte)0x06;
最终我需要将收音机的响应转换为可读信息并将其显示在数据网格视图上以供用户查看,但那是稍后的事,现在我只是想确保连续剧播放良好。
关于通讯参数,你已经正确设置了。 TxContinueOnXoff
参数应该没有意义,因为 Xon/Xoff flow control
设置为 false
。
您需要区分字节值的 ASCII 表示和 HEX 表示。 Ascii table
如果文档使用十六进制表示发送和接收的数据,您应该将文档与 实际数据作为十六进制表示,而不是文本进行比较。
如果以十六进制形式查看,似乎第一个响应确实与文档匹配。当记录的十六进制表示被转换为 ASCII(不可打印字符 0x06 和 0xFF 除外)时,它与您调用 'something crazy'.
相同HEX: 06 50 33 32 30 37 33 33 FF 06 // expected, as hex
ASCII: - P 3 2 0 7 3 3 ? - // received, as text
0x06 和 0xFF 没有可打印字符,因此,无论您以前将消息视为文本,还是选择将 0x06
显示为破折号,将 0xFF
显示为问号。
只需将字节视为字节 - 字节,并使用文档将十六进制表示形式转换为 compare/verify。
只是好奇,这个协议叫什么,或者如果它是公开的,你有 link 分享吗?