我有一个硬币兑换器MEI Cashflow E7900
和一个 MDB 适配器,用于将设备连接到串行端口。卖给我适配器的商店还提供了一个测试应用程序,它是用 Delphi 编写的,用 Borland Delphi v6.0 编译。它工作得很好,但我的代码出于某种原因没有。
当您使用 MDB 时,您必须每 200 毫秒发送POLL
一次命令。如果一切正常,硬币兑换商会发送ACK
. 当我使用 Delphi 应用程序发送它时,会话如下所示:
=> 0x0B* 0x0B(星号表示奇偶校验设置为标记。默认奇偶校验为空格)
<= 0x00
所以一切都很好,这就是我所期待的。当我POLL
使用 C# 应用程序发送时,它就像:
=> 0x0B* 0x0B
<= 0x3F 0x00
有时,硬币兑换商发给我0x3F 0x11
之后POLL
毫无意义,没有像这样的任何有效回复。当我得到这样的响应时,我运行 Delphi 应用程序,它得到了一个有效的ACK
响应。我正在使用 COM 端口嗅探器来确保发送的数据没有任何差异,包括端口配置本身,并且我不断收到不同的响应。
下面是测试应用程序(Delphi)的源代码:
<...>
//The component used it called BComPort
form1.BComPort1.BaudRate:=br9600;
form1.BComPort1.Parity:=paSpace;
form1.BComPort1.Port:="%port name goes here%";
form1.BComPort1.Open;
<...>
procedure SetModeBit(modebit:boolean);
begin
if modebit then begin
form1.BComPort1.BeginUpdate;
form1.BComPort1.Parity:=paMark;
form1.BComPort1.EndUpdate;
end else begin
form1.BComPort1.BeginUpdate;
form1.BComPort1.Parity:=paSpace;
form1.BComPort1.EndUpdate;
end;
procedure TForm1.PollTimer(Sender: TObject);
var
s,buf,buf2:string;
i,len:integer;
x,adr,dat1,ack,chk:byte;
crc:integer;
<...>
adr:=$08 or $0B;
SetModeBit(true);
form1.BComPort1.Write(adr,1);
dat1:=0;
crc:=adr + dat1;
try
s:=inttohex(crc,10);
s:=s[length(s)-1]+s[length(s)];
chk:=strtoint('$'+s);
except
end;
SetModeBit(false);
form1.BComPort1.Write(chk,1);
此处提供完整的代码清单,但此处提供的代码应该足够了。
我的代码(C#):
private const byte P_ADDRESS = 0x8;
static void Main(string[] args)
{
<...>
port = new SerialPort(ports[index]);
port.BaudRate = 9600;
port.StopBits = StopBits.One;
port.DataBits = 8;
port.DtrEnable = true;
port.RtsEnable = true;
port.Parity = Parity.Space;
<...>
}
private static void onDataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] dataReceived = new byte[port.BytesToRead];
SetModeBit(false);
port.Read(dataReceived, 0, dataReceived.Length);
Console.WriteLine("Data received:");
foreach (Byte b in dataReceived)
{
Console.Write(b.ToString("X") + " ");
}
Console.WriteLine();
}
private static void SetModeBit(Boolean mode)
{
port.Parity = mode ? Parity.Mark : Parity.Space;
}
private static void SendData(Byte cmd, Byte[] data)
{
byte adr = (byte)(P_ADDRESS | cmd);
byte crc = adr;
foreach (var b in data)
crc += b;
SetModeBit(true);
port.Write(new byte[] { adr }, 0, 1);
SetModeBit(false);
if (data.Length > 0)
port.Write(data, 0, data.Length);
port.Write(new byte[] { crc }, 0, 1);
}
使用 Delphi 应用程序的轮询命令:
17.08.2012 18:05:18 COM8 Capture Started
17.08.2012 18:05:38 COM8 Opened By Process ID=2872
17.08.2012 18:05:38 Baud Rate =9600
17.08.2012 18:05:38 RTS Signal = True
17.08.2012 18:05:38 DTR Signal = True
17.08.2012 18:05:38 Line Control Change: SPACE-8-1
17.08.2012 18:05:38 Baud Rate =9600
17.08.2012 18:05:38 RTS Signal = True
17.08.2012 18:05:38 DTR Signal = True
17.08.2012 18:05:38 Line Control Change: MARK-8-1
17.08.2012 18:05:38 Write 1 Bytes:
0B ; .
17.08.2012 18:05:38 Baud Rate =9600
17.08.2012 18:05:38 RTS Signal = True
17.08.2012 18:05:38 DTR Signal = True
17.08.2012 18:05:38 Line Control Change: SPACE-8-1
17.08.2012 18:05:38 Write 1 Bytes:
0B ; .
17.08.2012 18:05:38 GetCommStatus Result:16
17.08.2012 18:05:38 Parity Error = True
17.08.2012 18:05:38 Baud Rate =9600
17.08.2012 18:05:38 RTS Signal = True
17.08.2012 18:05:38 DTR Signal = True
17.08.2012 18:05:38 Line Control Change: SPACE-8-1
17.08.2012 18:05:38 Read 1 Bytes:
00 ; .
使用我的应用程序轮询命令:
17.08.2012 18:12:08 COM8 Capture Started
17.08.2012 18:12:11 COM8 Opened By Process ID=3164
17.08.2012 18:12:11 Baud Rate =9600
17.08.2012 18:12:11 RTS Signal = True
17.08.2012 18:12:11 DTR Signal = False
17.08.2012 18:12:11 Line Control Change: SPACE-8-1
17.08.2012 18:12:11 Baud Rate =9600
17.08.2012 18:12:11 RTS Signal = True
17.08.2012 18:12:11 DTR Signal = True
17.08.2012 18:12:11 Line Control Change: SPACE-8-1
17.08.2012 18:12:11 DTR Signal = True
17.08.2012 18:12:11 Baud Rate =9600
17.08.2012 18:12:11 RTS Signal = True
17.08.2012 18:12:11 DTR Signal = True
17.08.2012 18:12:11 Line Control Change: MARK-8-1
17.08.2012 18:12:11 Write 1 Bytes:
0B ; .
17.08.2012 18:12:11 Baud Rate =9600
17.08.2012 18:12:11 RTS Signal = True
17.08.2012 18:12:11 DTR Signal = True
17.08.2012 18:12:11 Line Control Change: SPACE-8-1
17.08.2012 18:12:11 Write 1 Bytes:
0B ; .
17.08.2012 18:12:11 GetCommStatus Result:16
17.08.2012 18:12:11 Parity Error = True
17.08.2012 18:12:11 Read 1 Bytes:
3F ; ?
17.08.2012 18:12:11 Read 1 Bytes:
00 ; .
收到的数据似乎几乎相同,除了0x3F
在开始时。但是设备的行为也不同,它似乎没有连接到 PC,当我使用 C# 应用程序时显示“机器禁用”,当我使用 Delphi 应用程序时显示“状态正常”。这可能是因为 .NET Framework 而发生的吗?任何用于 COM 端口交互的库名称都可以使用。
我有想法,为什么我得到不同的反应。也许我希望这里有人能帮助我。提前致谢。也感谢您阅读这个巨大的问题。