串口通信项目

时间:2011-09-29 06:14:43

标签: c# visual-studio serial-port

我正在进行停车场展示系统的最后一年项目。它的作用基本上是检测停车场中的任何车辆,更新可用的车辆数量并显示它是否已满。

我在使用Microsoft Visual Studio 2008在C#中编写程序时遇到问题。我从我的其他项目伙伴正在发送的串口获取数据。我需要做的就是接收数据,然后读取数据。这只是为了模拟被占用和清空的车辆。我需要编辑我的程序,以便我可以接收和更新有关批次的数据是否被占用和调用其他功能。接收的数据将在ascii中。每批将分配给一个特定的ascii。例如,0x5A用于lot1,0x59用于批次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();

        }

2 个答案:

答案 0 :(得分: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,例如) 。请尝试发布我们可以帮助您修复的正确示例代码 - 这有太多问题可以确定您的真正问题(特别是因为您没有说出问题所在!)

答案 1 :(得分:0)

我看到你已经连接了串口的datareceived事件处理程序。如果是这样,你为什么不使用它?只要数据通过串行端口发生,事件就会激活,这样就可以更好地漫无目的地轮询串行端口的数据,这只会浪费资源。

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

      // Invoke delegate using dispatcher to update UI

}