代码之家  ›  专栏  ›  技术社区  ›  SunAwtCanvas

C#-串行端口。ReadLine()冻结我的程序

  •  4
  • SunAwtCanvas  · 技术社区  · 8 年前

    我正在尝试使用波特率9600通过串行端口读取从Arduino发送的消息。

    我的Arduino代码被编程为每当我按下按钮时发送一个“1”,当我将手指从按钮上松开时发送一个“0”。

    所以它不会一直发送数据。

    我的C#程序是读取该消息并将其添加到列表框中。但只要我启动它,程序就会挂起。

    private void button1_Click(object sender, EventArgs e)
    {
        SerialPort port = new SerialPort();
        port.BaudRate = 9600;
        port.PortName = "COM4";
        port.ReadTimeout = 1000;
        port.Open();
    
    
        timer1.Start();
    }
    
    private void timer1_Tick(object sender, EventArgs e)
    {
        try
        {
            ee = port.ReadLine();
            listBox1.Items.Add(ee);
        }
        catch (Exception)
        {
            timer1.Stop();
        }
    }
    

    我想,可能是因为我的程序应该在接收之前检查是否有可用的数据可以接收?

    2 回复  |  直到 8 年前
        1
  •  5
  •   TheGeneral    8 年前

    试试这样吧。它至少不会挂起,然后您可以整理您通过 DataReceived

    从那里,您可以决定如何更好地编写应用程序

    private void button1_Click(object sender, EventArgs e)
    {
        SerialPort port = new SerialPort();
        port.BaudRate = 9600;
        port.PortName = "COM4";
        port.ReadTimeout = 1000;
    
       // Attach a method to be called when there
       // is data waiting in the port's buffer
       port.DataReceived += new
          SerialDataReceivedEventHandler(port_DataReceived);
    
       // Begin communications
       port.Open();
    }
    
    private void port_DataReceived(object sender,
                                     SerialDataReceivedEventArgs e)
    {
       // Show all the incoming data in the port's buffer in the output window
       Debug.WriteLine("data : " + port.ReadExisting());
    }
    

    SerialPort.DataReceived Event

    指示已通过表示为的端口接收数据 SerialPort对象。

    SerialPort.ReadExisting Method ()

    根据编码读取两个 SerialPort对象的流和输入缓冲区。

        2
  •  3
  •   oakar    8 年前

    要避免此问题,您需要添加 “\n” 到arduino中的数据,因为 港口城市ReadLine();搜索结束行 (“\n”)

    例如,假设arduino发送的数据是 “1” ,以使用端口读取此数据。ReadLine();应该是这样的 “1\n”

    还有,别担心,波特。ReadLine(); 不读取“\n” 。当它看到“\n”时,就停在那里。

    我希望这有帮助。