RS232で作業するときに起こりうる問題の1つ

このトピックでは、「戦闘」の経験を1つの中国のデバイスで共有したいと思います。 職場では、注文を受けて、古いカードリーダーを新しいものに変更するのが習慣でした。 一番下の行は、古い読者がアクティブだったということです。 無限ループで、彼らはカードを数えようとしましたが、新しいものはすでに受動的でした-あなたが彼らにコマンドを送るまで、彼らは働きません。 デバイスCR501AU V3のモデル(突然誰かが重宝します)。 中国語デバイス、ドキュメントなし(中国語のみ)。 手元にあるのは、モデルのラベルといくつかのソースコードが入った箱だけでした。 ちなみに、ソースは1Cで書かれた別の部門からのものでした。 しかし、私たちのオフィスのプログラマーのスタッフが更新されたので、これらの古いソースで働いていた人は残っていなかったので、私はそれを理解しなければなりませんでした。 最初は、すべてが簡単でした。 Visual Basicスクリプトの一部が1Cソースコードに挿入され、リーダーとの連携を完全に担当しました。 VBを操作する手元には何もなかったので、Excelコンパイラを使用しました。



Function ReedCard() MSComm1.CommPort = 1 '  MSComm1.Settings = "19200,N,8,1" '  MSComm1.InputLen = 0 On Error Resume Next MSComm1.PortOpen = True MSComm1.Output = Chr(&HAA) & Chr(&HBB) & Chr(&H6) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H1) & Chr(&H2) & Chr(&H52) & Chr(&H51) '      .    "" .    hex  sleep (0.1) ' ,    (     ) Answer = MSComm1.Input MSComm1.Output = Chr(&HAA) & Chr(&HBB) & Chr(&H5) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H2) & Chr(&H2) & Chr(&H0) '    .  ,    —  . ,   ASCII- sleep (0.1) Answer = MSComm1.Input Dim ReadPort As String If Len(Answer) > 10 Then '       ,         14- .        ,      ,      5 . ,   >10,    Dim a: a = s2a(Answer) 'StringToArray-.      14   [14] Dim i For i = 0 To UBound(a) a(i) = Right(0 & Hex(Asc(a(i))), 2) '    ""    - ASCII-.      ,   ascii-     hex Next ReadPort = Join(a) MSComm1.Output = Chr(170) & Chr(187) & Chr(6) & Chr(0) & Chr(0) & Chr(0) & Chr(6) & Chr(1) & Chr(7) & Chr(0) '      ,  "" :) ..    (  ,   ,    ) ''''     ,       . : AA BB CC DD -> 2864434397.   ,      —      . End If MSComm1.PortOpen = False End Sub Function s2a(s) ReDim a(Len(s) - 1) Dim i For i = 0 To UBound(a) a(i) = Mid(s, i + 1, 1) Next s2a = a End Function Sub sleep(sk) PauseTime = sk Start = Timer Do While Timer < Start + PauseTime Loop End Sub
      
      





それほど難しくありません。 しかし問題は、このVBコードをMS-DOSのPascalに移植する必要があるということでした。 私はこれに数日間苦労しましたが、これらのコマンドをCom-portリーダーに送信しても、生命の兆候は見られませんでした。 次に、これを最初に「ネイティブ」言語で実装することにしました-C#。 私も汗をかかなければなりませんでしたが、最終的に私はキーが何であるかを理解しました!



 serialPort1.Open(); serialPort1.Write(((char)0xAA) + "" + ((char)0xBB) + "" + ((char)0x6) + "" + ((char)0x0) + "" + ((char)0x0) + "" + ((char)0x0) + "" + ((char)0x6) + "" + ((char)0x1) + "" + ((char)0x7) + "" + ((char)0x0)); serialPort1.Close();
      
      





上記のコードは正しくありません。 私はしばらくの間彼と実験したが、彼は働きたくなかった。 引用符を削除しました。 .ToString()が追加されました。 そして彼はポートにキャラクターを書きました。 なし。 そして、突然それは夜明けしました:



 serialPort1.Open(); byte[] ar = new byte[10]; ar[0] = 170; ar[1] = 187; ar[2] = 6; ar[3] = 0; ar[4] = 0; ar[5] = 0; ar[6] = 6; ar[7] = 1; ar[8] = 7; ar[9] = 0; serialPort1.Write(ar, 0, ar.Length); serialPort1.Close();
      
      





そしてうまくいきました! これをPascalに転送するだけです。

 var ar: array of Byte[10]; begin OpenCom (ComNo, B_19200, Bits_8+Stops_1+Parity_No, 2048); ar[0]:=170; ar[1]:=187; ar[2]:=6; ar[3]:=0; ar[4]:=0; ar[5]:=0; ar[6]:=6; ar[7]:=1; ar[8]:=7; ar[9]:=0; for i:=0 to 10 do begin WriteCom(ComNo,ar[i]); end;
      
      





上記のコードにより、読者は「ピクルス」になります。 さらに、すべてを自分でやり直すのは非常に簡単です。



PSこの問題に関する情報はruセグメントにはまったく見つかりませんでしたが、英語では穀物があります。 中国のカードリーダーの例を使用して、RS232の操作に関する情報を収集しました。 誰かが助けてくれることを願っています。 頑張って



All Articles