locked
C#讀取USB RFID資料問題使用LibUsbDotNet RRS feed

  • 問題

  • ErrorCode ec = ErrorCode.None;

    UsbEndpointReader reader = MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep01);

    byte[] readBuffer = new byte[128];

    while (ec == ErrorCode.None)
        {
             int bytesRead;
             ec = reader.Read(readBuffer,1000, out bytesRead);

             if (bytesRead == 0) throw new Exception(string.Format("{0}:No more bytes!", ec));

             Console.WriteLine("{0} bytes read", bytesRead);

             Console.Write(Encoding.Default.GetString(readBuffer));   

    }

    當我的RFID讀取器讀取時,讀取數據確實有可讀取到,但若讀取數據無法填充滿byte[128]時,讀取將回報超時,將數據量需求成byte[64]又會讀不到全部的資料,byte[X]的X資料輸入非2的次數進行讀取時回報超時 , 查看 bytesRead 輸出都是 0, LibUsbDotNet 的 UsbEndpointReader.Read 寫得相當的簡化,我不清楚他是怎麼運作的,還請大家解惑。










    • 已編輯 SkySnake 2021年11月3日 上午 08:33
    2021年11月3日 上午 08:16

解答

所有回覆

  • 參考既有討論修改你的迴圈

    https://social.msdn.microsoft.com/Forums/zh-TW/home?sort=relevancedesc&brandIgnore=True&searchTerm=MemoryStream%2BBuffer


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 SkySnake 2021年11月8日 上午 09:04
    2021年11月3日 上午 11:22
  • byte[] readBuffer = new byte[160]; while (true)//ec == ErrorCode.None) { int bytesRead;

    ec = reader.Read(readBuffer,5000, out bytesRead); byte[] readBuffer2 = new byte[10]; int count = 0; for (int i = 0; i < readBuffer.Length; i++) { if (readBuffer[i] != 0) { readBuffer2[count] = (byte)(readBuffer[i]+19); if (readBuffer2[count] == 58) readBuffer2[count] = 48; count++; } }

    Console.Write(Encoding.Default.GetString(readBuffer2) + "\r\n"); } }

    當我把byte[]中的數字更改成160後,ec的回覆就恢復正常了。



    • 已編輯 SkySnake 2021年11月8日 上午 06:28
    2021年11月8日 上午 06:26
  • 看了裡面的一些文章的理解是,我其實只要把讀取長度改短並讓程式多迴圈幾次就可以解決了像是

    byte[] readBuffer = new byte[256];
                        while (true)
                        {
                            int bytesRead,x=0;
                            ec = reader.Read(readBuffer, 0, 16, 100, out bytesRead);
                            if (bytesRead == 0) Console.Write(("{0}:No more bytes!", ec,"\r\n"));
                            else for (int i = 16; x < 9; x++,i+=16) ec = reader.Read(readBuffer, i, 16, 100, out bytesRead);
    
                            if (x >= 9)
                            {
                                byte[] readBuffer2 = new byte[10];
                                int count = 0;
                                for (int i = 0; i < readBuffer.Length; i++)
                                {
                                    if (readBuffer[i] != 0)
                                    {
                                        readBuffer2[count] = (byte)(readBuffer[i] + 19);
                                        if (readBuffer2[count] == 58) readBuffer2[count] = 48;
                                        count++;
    
                                    }
                                }
                                Console.Write(Encoding.Default.GetString(readBuffer2) + "\r\n");
                                Thread.Sleep(100);
                            }
                        }

    測試過也沒什麼問題,感謝指點。

    2021年11月8日 上午 09:04