2015-05-18 21 views
1

我使用Visual C#2010 Windows窗體應用程序串口 對象接收十六進制數據串口字節。
但是,我意識到我的DataReceived事件被觸發兩次,即使我已經讀取了緩衝區中的所有數據字節,並且緩衝區顯示0字節要讀取。
爲什麼會發生這種情況?串行端口對象的DataReceived事件檢索射擊兩次

private void PortData(Object Sender,  System.IO.Ports.SerialDataReceivedEventArgs e) 
{ 
    this.Invoke(new EventHandler(delegate { DisplayText(); })); 
} 

Private void DisplayText() 
{ 
    int dataLength = serialPort1.BytesToRead; 
    byte[] data = new byte[dataLength]; 
    serialPort1.Read(data, 0, dataLentgh) 
} 

我的串行端口上發送8個字節的十六進制I-E FF FF FB FB FB FF其在通過讀取功能數據陣列接收FB。但此後 PortData函數被第二次調用以讀取0個字節。我不想讓它第二次調用。

+0

歡迎來到StackExchange!對於第一個問題,這非常好 - 如果你提到了你正在使用的實際命名空間和類名,你的問題將更容易回答(因此更有可能吸引答案),並且在未來也更容易找到。更好的是,如果你鏈接到參考手冊,並引用你有問題的部分。 – RJHunter

+0

可能有幾個原因(可能是在你讀取字節之前被解僱) - 你能顯示你的代碼嗎?也許我們可以幫助你解決這個問題(因爲它確實應該是沒有問題的) – Carsten

+0

private void PortData(Object Sender,System.IO.Ports.SerialDataReceivedEventArgs e) \t this.Invoke(new EventHandler(delegate {DisplayText ();})); } Private void DisplayText() { \t int dataLength = serialPort1.BytesToRead; \t byte [] data = new byte [dataLength]; \t serialPort1.Read(data,0,dataLentgh) } 我在串行端口i-e FF FF FB FB FB FF FB上發送8個十六進制字節,它們是通過讀功能在數據數組中接收到的。但此後 PortData函數被第二次調用以讀取0個字節。我不想讓它第二次調用。 –

回答

6

當您收到二進制數據時,這是完全正常的。忘記檢查e.EventType屬性是一個標準的錯誤。只要您收到字節值0x1A(文件結束符),就會引發該事件。無法設置EOF字符或完全禁用它,這是一個疏忽。你只能忽略它們:

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { 
     if (e.EventType == System.IO.Ports.SerialData.Eof) return; 
     // Rest of code 
     //... 
    }