C# - SerialPort.ReadLine()冻结我的程序

时间:2018-03-23 08:25:24

标签: c# arduino serial-port readline

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

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

所以它不是经常发送数据。

我的C#程序是读取该消息并将其添加到ListBox。但每当我启动它时,程序就会挂起。

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 个答案:

答案 0 :(得分:3)

尝试这样的事情。它至少不会挂起,然后您可以通过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对象的流和输入缓冲区。

答案 1 :(得分:2)

要避免此问题,您需要在arduino中为数据添加“\ n”,因为 port.ReadLine();搜索结束行(“\ n”)

例如,假设arduino发送的数据是“1”,用port.ReadLine()读取此数据;它应该是“1 \ n”

另外,不用担心,port.ReadLine(); 未读取“\ n”。当它看到“\ n”时就停在那里。

我希望它有所帮助。