MEI Cashflow E7900
デバイスをシリアル ポートに接続するためのコイン チェンジャーと MDB アダプターがあります。アダプタを販売してくれたショップでは、Delphi で作成され、Borland Delphi v6.0 でコンパイルされたテスト アプリケーションも提供されました。それは完全に機能しますが、何らかの理由で私のコードは機能しません。
MDB を使用する場合POLL
、200ms ごとにコマンドを送信する必要があります。すべてが OK の場合、コイン チェンジャーは を送信しますACK
。Delphi アプリケーションを使用して送信すると、セッションは次のようになります。
=> 0x0B* 0x0B (星印はマークに設定されたパリティを意味します。デフォルトのパリティはスペースです)
<= 0x00
だから、すべてがOKです。それが私が期待していることです。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 アプリケーションでの Poll コマンド:
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 アプリケーションを使用すると「ステータス OK」と表示されます。これは .NET Framework が原因で発生している可能性がありますか? COM ポートの相互作用のためのライブラリーの名前はすべて承認されます。
なぜ私は異なる反応を得るのですか?ここの誰かが私を助けてくれることを願っています。前もって感謝します。また、この巨大な質問を読んでくれてありがとう。