2013-07-10 37 views
1

我試圖從連接到COM端口的掃描器讀取字節到字節數組中。 C#中的串行端口庫已經具有Read函數,這是我用來嘗試讀取的函數。我有它的設置,以便讀入的字節輸出到控制檯。我正在使用一個非常可預測的協議,所以我知道當我在代碼中傳遞該行時,我期待的是什麼樣的字節數組。但是,如果我運行該程序,我只能讀取一個字節。如果我重新運行同一個程序實例(通過發送相同的讀命令),我會得到剩餘的預期字節。只有在我第三次運行這個命令後,才能得到我期望的所有字節。這個問題是完全避免的,但如果我只是在讀取線上插入一個斷點並跨越那一行。如果我這樣做,我每次都會得到完整的閱讀。我的問題是,如何在不插入斷點的情況下每次完成讀取操作?我試過使用系統暫停的方法來停止執行,並讓COM端口掃描得足夠快,這是行不通的。我也試過使用一個線程(見下面的代碼)。這也沒有奏效。有什麼建議麼?不完整的串行端口讀取C#

t = new Thread(() => device.Read(buffer)); 
    t.Start(); 
    t.Join(); 

再次,我希望只輸出採用的是全包之後再發送讀命令幾次或踩踏在具有斷點上面的命令。否則,我會用小的「字節大小的樣本」得到我的預期輸出。任何幫助表示讚賞!

+0

你的代碼不是有效代碼,沒有'SerialPort'函數只接受一個字節數組。只有兩個'Read'函數[都](http://msdn.microsoft.com/en-us/library/ms143549.aspx)[有](http://msdn.microsoft.com/en-us /library/34t733fh.aspx)三個參數 –

+2

爲什麼不使用串口的datareceived事件來獲取數據?由於datareceived處理程序位於其自己的線程中,因此無需使用其他線程。 – user2019047

+0

讀過載以接受字節數組 –

回答

3

這是字節流的預期行爲。循環讀取並抽取無論多少字節接收到您的ProtocolUnit類實例,(或其他),直到它完成並驗證。

+0

[Stream.Read](http://msdn.microsoft.com/en-us/library/System.IO.Stream.Read.aspx)有一個很好的正確方法示例調用'Read' –

0

我最近張貼在這裏發現了一個類似的問題: SerialPort.DataReceived Returning Strange Results

的問題是,如你所知,該程序會嘗試從緩衝區,而不該設備已完成發行,它的運行任何命令任何保證讀取。我的建議是實現這個職位的第一個答案: Reading from the serial port in C#

我的實現是在DataReceived事件檢索如下:

void serialPort_DataReceived(object s, SerialDataReceivedEventArgs e) 
    { 
     byte[] data = new byte[serialPort.BytesToRead]; 
     serialPort.Read(data, 0, data.Length); 
     Console.Write(System.Text.Encoding.UTF8.GetString(data)); 
    } 

而只是爲了在代碼接線起來:

serialPort.DataReceived += serialPort_DataReceived; 
0

最好的方法放入while循環,並且在字節讀取之間給予10毫秒的休眠時間。這將使掃描器在COM端口寫入數據10毫秒。實際上,當您在網絡端口連接掃描儀時會發生問題。

您還可以編寫委託或事件,以便在數據從掃描儀完全讀取時進行通知。