2011-08-04 182 views
1

Goodday大家,的SerialPort停下來早與接收

我的問題是這樣的:

我用的SerialPort溝通,像設備的ZigBee和我打發但是,這是工作在C#應用程序如下:

(字符串爲「0023000D6F000076CF27431e」(在圖片發送兩次)

我從設備得到答案的一部分(讀取圖片窗口):

send the string twice with different answer

然而,當我送「0023000D6F000076CF27431e」通過終端直接到端口我得到的設備來回答這個: By therminal

這是完整的連接正確答案。

當然,我需要最後一行(其中0024部分)。

我認爲(我不是編程尚未很好)這部分收到的數據:

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    {// Event for receiving data 


     string txt = port.ReadExisting(); 
     Thread.Sleep(10); 
     List<PlugwiseMessage> msg = reader.Read(Regex.Split(txt, "\r\n")); 
     DataReceived(sender, new System.EventArgs(), msg); 

我GOOGLE了約ReadExisting但似乎這是去TE正確的方法???? 或者它不是?

有人可以向我解釋這種行爲嗎?

+0

好的,什麼是什麼?那是screendump你的程序嗎?還是標準的終端?你寫的發送代碼(以及)? –

+0

你好Henk,screendumps來自一個串口監視器。 – Plumbum7

回答

1

這是設計。 ReadExisting()完成它所說的,它只返回串口讀緩衝區中存在的字符。串行端口是非常慢的設備,每次ReadExisting()調用通常只會得到幾個字符。當您使用調試器時,這尤其棘手,會使您的程序變慢,讓串口驅動程序有時間接收更多字符。

您可以使用ReadLine()代替,每次調用都會從串行終端輸出中獲得一行文本。這是有效的,因爲設備發送換行符作爲行終止符(十六進制轉儲中的0x0a)。刪除Sleep()調用,這隻會讓事情變得更糟。

+0

漢斯你是對的!然而,我現在有另一個問題:在te設備的答案有4「0d0a」行終止符。我怎樣才能到達第四個? – Plumbum7

+2

你不明白答案。第四名終結者尚未發送。設置SerialPort.NewLine =「\ r \ n」並使用ReadLine(),你會沒事的。 –

+0

這是一個異常錯誤(我沒有提及(我的錯)),因爲接收到的字符串並不是程序所期望的,現在ReadExisting仍然有效。 – Plumbum7