2017-04-14 20 views
0

我一個問題,我的SerialDataEventHandler,它只是一次,讓我用下面的代碼解釋:我SerialDataEventHandler工作只是一次

public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) 
    { 
     //init serialport comport 
     SerialPort comport = (SerialPort)sender; 

     // Shortened and error checking removed for brevity... 
     if (!comport.IsOpen) return; 
     int bytes = comport.BytesToRead; 
     byte[] buffer = new byte[bytes]; 
     comport.Read(buffer, 0, bytes); 
     HandleSerialData(buffer, comport); 
     comport.DataReceived -= 
      new SerialDataReceivedEventHandler(DataReceivedHandler); 
    } 

    public void HandleSerialData(byte[] respBuffer, SerialPort comport) 
    { 
     StringBuilder hex = new StringBuilder(respBuffer.Length * 2); 
     foreach (byte b in respBuffer) 
      hex.AppendFormat("{0:x2}", b); 

     string hex2 = hex.ToString(); 
     hex2 = hex2.Substring(22, 8); 
     Dispatcher.BeginInvoke((Action)(() => { EnOcean_Label.Content = hex2; })); 
     Dispatcher.BeginInvoke((Action)(() => { EnOcean2_Label.Content = hex2; })); 
    } 

所以,我註冊在DataGrid中我的數據,但它不」在這裏,我唯一的問題是,我的代碼只工作一次,在第一次調用之後它需要「永久」工作,我應該使用什麼函數/方法讓程序從我的SerialPort中獲取新數據。

+0

究竟是什麼讓你決定取消訂閱活動?那hex2.SubString()調用永遠不能正常工作,通常你只能得到1或2個字節。在調試時,似乎可以正常工作,並且通過單步執行使程序故意慢,但在全速運行時不起作用。你必須重新考慮這一點。 –

+0

我的電報每次用戶按下一個物理按鍵時只有24個字節,看不出爲什麼子串是個問題 –

+1

*您通常只有1或2個字節*。不是24.串口實現了一個簡單的字節流,就像TCP一樣,它對「電報」一無所知。你必須數它們自己,將它們存儲在一個字節[]中。而不是調用HandleSerialData(),直到你得到所有的。 –

回答

1

您只會收到一次數據通知事件,因爲您在第一次發佈時取消訂閱DataReceived。刪除

comport.DataReceived -= 
     new SerialDataReceivedEventHandler(DataReceivedHandler); 

DataReceivedHandler

+0

即使這樣也行不通.. –