2010-09-25 67 views
3

我想從秤RS232接口讀取數據。它通過串行端口發送一個連續的ASCII字符串流,我很難得到。我只想得到它發出的一行數據。我猜想我會使用Readline來獲取數據,但是當我運行它時,它只會鎖定PC。我認爲它是試圖獲得所有的數據,並不會停止,直到數據停止?這裏是我正在使用的代碼:從串口讀取線鎖定

private void button1_Click(object sender, EventArgs e) 
    { 
     serialPort1.PortName = "COM4"; 
     serialPort1.BaudRate = 9600; 
     serialPort1.DataBits = 8; 
     serialPort1.Parity = Parity.None; 
     serialPort1.StopBits = StopBits.One; 

     //opening the serial port 
     serialPort1.Open(); 

     string str = serialPort1.ReadLine(); 

     MessageBox.Show(str); 

     serialPort1.Close(); 

    } 

你能幫我確定如何只獲得一行輸出數據並關閉連接嗎?

+0

當你說「鎖定電腦」,它真的鎖定整個電腦,或只是你的程序? – 2010-09-25 18:14:36

+0

對不起,我的意思是它鎖定了程序。 – muncherelli 2010-09-25 18:16:00

+0

@user:此線程看起來回答給我。你還需要什麼? – 2010-09-30 17:32:04

回答

2

SerialPort.ReadLine被定義爲阻止「直到第一次出現NewLine值」,其中NewLine默認爲換行符。你在流中發送了一個換行符嗎?請注意,換行字符(ASCII 0x0A)與您可能發送的回車符(ASCII 0x0D)不同。

如果需要,您可以重新定義NewLine,或者如果行結尾不正確,可以使用SerialPort.ReadTo來讀取給定的字符串。您也可以設置read timeout

您可能更喜歡使用SerialPort.Read重載之一從端口讀取給定數量的字節,而不是行。

如果這些都不適用,請確保您確實在發送數據(您認爲自己的位置) - 調出超級終端/ TeraTerm /您最喜歡的串行終端,使用上面使用的相同串行端口設置進行配置,並確保你看到你期望看到的數據。

0

一個理想的解決方案是產生一個工作線程,從串口實際讀取(因此,線程可以整天被阻塞而不會阻礙主應用程序線程)。一旦收到數據,它就可以廣播一個事件,注意到已收到數據以及該數據是什麼。該線程將通過事件與主應用程序線程進行通信。