我正在尝试通过串口使用波特率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();
}
}
我想,也许原因是我的程序应该在收到之前检查是否有可用的数据?
答案 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对象。
SerialPort.ReadExisting Method ()
根据编码读取所有立即可用的字节 SerialPort对象的流和输入缓冲区。
答案 1 :(得分:2)
要避免此问题,您需要在arduino中为数据添加“\ n”,因为 port.ReadLine();搜索结束行(“\ n”)
例如,假设arduino发送的数据是“1”,用port.ReadLine()读取此数据;它应该是“1 \ n”
另外,不用担心,port.ReadLine(); 未读取“\ n”。当它看到“\ n”时就停在那里。
我希望它有所帮助。