最佳解答者
C#讀取USB RFID資料問題使用LibUsbDotNet

問題
-
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
解答
-
參考既有討論修改你的迴圈
不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?
- 已標示為解答 SkySnake 2021年11月8日 上午 09:04
2021年11月3日 上午 11:22
所有回覆
-
參考既有討論修改你的迴圈
不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?
- 已標示為解答 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