0

さて、シリアル通信デバイスの同じ問題で、ほぼ20 日間立ち往生しています。タグを読み取り、シリアル COM ポート 1 または 3 を介して読み取るたびにタグ コード番号を返すハードウェア センサーがあります。使用するこれらのいずれも問題ありません。私は、受信データを操作するために c# で記述したプログラムを使用しています。ここでの問題は、たとえば、センサーがコード「e2 0 10 1 83 10 1 23 7 0 d0 c0 1 be」 のタグを読み取る場合、センサーのスイッチをオフにして再度オンにしない限り、このタグを再度読み取ることはありません (電源リセット)。 )。したがって、ポートを閉じるまで、読み取ったすべてのデータをセンサーに忘れさせる方法がわかりません。誰でも助けてください私は今絶望的です ある人は、いくつかのコマンドでデバイスに書き込む必要があると言いましたが、それ以上のことは知りませんでした。現在のコードは次のとおりです。

 void IntializeSensor()
    {
        try
        {
            if (mySerialPort==null)
            {
                mySerialPort = new SerialPort("COM3");

                mySerialPort.BaudRate = 9600;
                mySerialPort.Parity = Parity.None;

                mySerialPort.StopBits = StopBits.One;
                mySerialPort.DataBits = 8;
                mySerialPort.ReadTimeout = 2000;
                mySerialPort.Handshake = Handshake.None;
                LoglistBox.Items.Add("--Port Intilalized at COM1--");
                mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            }

        }
        catch (Exception ex)
        {

            MessageBox.Show(ex.Message);
        }
    }
  void OpenPort()
    {
        try
        {
            str = "";

            if (mySerialPort.IsOpen)
            {
                ClosePort();
                Thread.Sleep(6000);

            }
            mySerialPort.Open();

            LoglistBox.Items.Add("--Port Opened at COM1 Success--");
        }
        catch (Exception ex)
        {


            LoglistBox.Items.Add("--Port Opened Failed--Error: "+ex.Message);
        }
    }

ボイドクローズポート() {

        try
        {
            mySerialPort.Write("ABCABCABCABCABC");
            mySerialPort.DiscardInBuffer();
            mySerialPort.DiscardOutBuffer();
            mySerialPort.Dispose();
            mySerialPort.Close();

            LoglistBox.Items.Add("--Port Closed at COM1 Success--");
        }
        catch (Exception ex)
        {

            LoglistBox.Items.Add("--Port Closed Failed--Error: " + ex.Message);
            MessageBox.Show(ex.Message);
        }

    }

private void DataReceivedHandler(オブジェクト送信者,SerialDataReceivedEventArgs e) {

        try
        {

            if (e.EventType != SerialData.Chars) return; 
            SerialPort COMPort = (SerialPort)sender;

            int bytes = COMPort.BytesToRead;

            //create a byte array to hold the awaiting data

            byte[] comBuffer = new byte[bytes];

            //read the data and store it

            COMPort.Read(comBuffer, 0, bytes);



            // System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();

            str = ByteArrayToHexString(comBuffer);

            holdfirstvalue += str;
            //str = str +" "+ str;
            //MessageBox.Show("after concat "+str);


            if (str.Contains("FF") || str.Contains("F F") || str.Contains("F"))
            {


             SetText(holdfirstvalue.ToString());// ONE TAG CODE SENT TO BE SET IN LIST
                str = "";
                holdfirstvalue = "";
            }

        }

        catch (Exception ex)
        {
           // LoglistBox.Items.Add("--Port Opened Failed--Error: " + ex.InnerException);
            MessageBox.Show(ex.Message+" "+ex.InnerException);
        } 

    }
4

2 に答える 2

1

おっしゃる通り、同梱のプログラムでも同じバーコードを2回連続で読み取ることはありません。私は正しいですか?

私には、「タグ リーダーの製造元」が、ユーザーがチェックアウト時にアイテムを誤って 2 回スキャンするのを防ぐために、意図的にそのメカニズムを配置した可能性があるようです。同じものがスキャナーにとどまったり、物を移動するときにスキャナーに数回交差したりすることがよくあるためです。

スキャナーのファームウェアにアクセスできず、自分で変更できる場合を除き、製造元に連絡することをお勧めします。これはメーカーに直接問い合わせて聞いてみます。同じアイテムを複数回スキャンするという特殊なケース (複数の同様のものを購入するなど) のために、スキャナに「ロック モードを解除してスキャンを再開する」ように指示するコマンドが必要です。

デバイスに送信できるすべてのコマンドのリストを含むマニュアルを提供する必要があり、このコマンドを使用してシステムを構築します。

もう1つ試してみてください!「Real Term」または他の端末監視アプリケーションを使用してシリアル ポートを調べて、同じ項目を再度スキャンした後にスキャナがコードを PC に送信するかどうかを確認できますか? これにより、問題を切り分けて、それがスキャナ ファームウェアであるかデスクトップ ソフトウェアであるかを確認できます。(リセットすると正常に動作するとおっしゃっているので、スキャナーのファームウェアが項目を無視していると思われます)

編集:また、DataREADyEventに基づいてシリアルポートを読み取っていることがわかります。これが私であれば、シリアルポートを常に読み取り続けるために、20ミリ秒または50ミリ秒などの非常に短い遅延で別のスレッドを追加します。これをネット上で実装する方法の例はたくさんありますが、簡単で迅速な方法の 1 つをここで説明します。

C# でスレッド化を使用して COM ポートを読み取る

それが役に立てば幸い。

于 2013-10-24T19:15:18.963 に答える
0

わかりましたので、実際にセンサーをリセットする16進数のコードを最終的に見つけました。ミドルレンジUHF RFIDリーダーまたはこのモデルのあらゆるタイプを購入した人を助けるために。

私たちがしたことは、データピンに銅線をはんだ付けすることで、シリアルポートのワイヤーをハッキングしたことです。次に、これらの銅線のもう一方の端をラップトップに接続し、端末リーダー「Putty」を使用して、RESET HEAD ボタンのクリック時に PC からリーダーに実際に何が送信されているかを確認しました。

このようにして、16 進コードを見つけ、それをバイト配列に変換しました。シリアル ポートでリーダー デバイスに書き込み、デバイスをリセットする C# コードは次のとおりです。

{ 
mySerialPort.Open();
        byte[] bytesToSend = StringToByteArray("A00265F9");// correct command to reset READER
        mySerialPort.Write(bytesToSend, 0, 4);
}
public static byte[] StringToByteArray(string hex)
        {
            return Enumerable.Range(0, hex.Length)
                             .Where(x => x % 2 == 0)
                             .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                             .ToArray();
        }
于 2013-10-25T19:56:54.770 に答える