2011-09-29 80 views
1

我正在做停車場顯示系統的最後一年項目。它的基本功能是檢測停車場中的任何車輛,更新可用的車輛數量並顯示是否已滿。串口通訊工程

我在使用Microsoft Visual Studio 2008編寫C#程序時遇到了麻煩。我從串口收到我的其他項目隊友發送的數據。我需要做的就是接收數據,然後讀取數據。這只是爲了模擬車輛被佔用和清空。我需要編輯我的程序,以便我可以接收和更新有關批次的數據,無論它是否被佔用並調用其他功能。數據接收將採用ASCII格式。每批將被分配到一個特定的ascii。例如0x5A是lot1,0x59是lot 2等。

這是我的項目的一個示例。

int intNumberLots = 6; 

    SerialPort serialPort = new SerialPort("COM1"); 

    serialPort.BaudRate = 115200; 
    serialPort.Parity = Parity.None; 
    serialPort.StopBits = StopBits.One; 
    serialPort.DataBits = 8; 
    serialPort.Handshake = Handshake.None; 

    serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 

    serialPort.Open(); 

    private void startButton_Click(object sender, EventArgs e) 
    { 
     while(){ 
     if (serialPort.ReadLine == "0x57" && intNumberLots >= 0)  // if data received is "1", do tasks below 
     { 
      inputTextBox.Clear(); // clear input textbox 
      pictureBox1.Visible = true;  // show a picture of a vehicle 
      intNumberLots--; // decrease the number of available parking lots shown 
      label9.Text = intNumberLots.ToString(); 

     } 
     else if (serialPort.ReadLine == "0x58" && intNumberLots >= 0) 
     { 
      inputTextBox.Clear(); 
      pictureBox2.Visible = true; 
      intNumberLots--; 
      label9.Text = intNumberLots.ToString(); 

     } 
     else if (serialPort.ReadLine == "0x59" && intNumberLots >= 0) 
     { 
      inputTextBox.Clear(); 
      pictureBox3.Visible = true; 
      intNumberLots--; 
      label9.Text = intNumberLots.ToString(); 

     } 
     else if (serialPort.ReadLine == "0x5A" && intNumberLots >= 0) 
     { 
      inputTextBox.Clear(); 
      pictureBox4.Visible = true; 
      intNumberLots--; 
      label9.Text = intNumberLots.ToString(); 

     } 
    } 

然後對於更新如果沒有汽車的地段的代碼;

 else if (string.str != "0x57" && intNumberLots >= 3) 
     { 
      inputTextBox.Clear(); 
      pictureBox1.Visible = false; 
      intNumberLots++; 
      label9.Text = intNumberLots.ToString(); 

     } 

     else if (string.str != "0x58" && intNumberLots >= 3) 
     { 
      inputTextBox.Clear(); 
      pictureBox2.Visible = false; 
      intNumberLots++; 
      label9.Text = intNumberLots.ToString(); 

     } 

     else if (string.str != "0x59" && intNumberLots >= 3) 
     { 
      inputTextBox.Clear(); 
      pictureBox3.Visible = false; 
      intNumberLots++; 
      label9.Text = intNumberLots.ToString(); 

     } 

     else if (string.str != "0x5A" && intNumberLots >= 3) 
     { 
      inputTextBox.Clear(); 
      pictureBox4.Visible = false; 
      intNumberLots++; 
      label9.Text = intNumberLots.ToString(); 

     } 
+0

你真正的問題是什麼?我不認爲這是一個問題。 –

+0

好...繼續下去。 – Reniuz

回答

1

serialPort.ReadLine每次調用將會阻塞,直到下一行進來。

您需要serialPort.ReadLine一次在循環頂部到一個變量和測試。

While(){ 

    message = serialPort.ReadLine(); 

    if (message == "0x57" && intNumberLots >= 0)  // if data received is "1", do tasks below 
    { 
     ...etc. 

而且,是數據確實包括所述字符"0x5A"等的字符串或各是一個字符'0x5A'

我注意到,你的榜樣是不是真正的代碼 - (While代替whileserialPort.ReadLine代替serialPort.ReadLine()string.str,例如)。請嘗試發佈適當的示例代碼,我們可以幫助您解決問題 - 這有太多的問題,以確定您的真實問題(特別是因爲您沒有說過問題是什麼!)

+0

此方法可能會阻止導致它無響應的UI線程 – paradox

+0

這是非常正確的 - 雖然它會比原來的響應更少;-)當然,它需要使用非阻塞方法來讀取端口,或在單獨的線程上運行。儘管如此,它說明了我試圖提出的觀點。事實上,鑑於原始代碼無法編譯,它仍然是一個潛在的改進! –

0

我看到你已經連接起來了串行端口的datareceived事件處理程序。如果是這樣,你爲什麼不使用它?只要數據通過串口發送,事件就會啓動,這更好地漫遊串口以獲取數據,這只是浪費資源。

public void DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
     var datareceived = serialport.ReadLine() 
     // Do data processing here 

     // Invoke delegate using dispatcher to update UI 

}