2011-09-29 58 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 

}