如何在发送命令后捕获串口的返回?回报没问题。我怎么读? 我尝试使用readLine()和ReadExisting()不起作用。
serialPort.PortName = "COM1";
serialPort.BaudRate = 115200;
serialPort.Open();
if (serialPort.IsOpen)
{
// Send command
serialPort.Write("at");
// string data = portaSerial.ReadLine();
// Close serial port
serialPort.Close();
}
答案 0 :(得分:5)
您需要将EventHandler附加到DataReceived Event。
从上面链接:
表示将处理SerialPort对象的数据接收事件的方法
private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Console.WriteLine("Data Received:");
Console.Write(indata);
}
您将在设计师中附加或以此类似程序附加。
serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
每次单击按钮时都会附加DataReceivedEvent处理程序,而Greg一旦提到您在发送数据时就关闭了端口,就会将其附加。看看这样的东西是否有效。我没有任何串行设备来测试它。我通常会在会话开始时打开端口并保持打开状态直到完成所有通信。
public partial class Form1 : Form
{
SerialPort serialPort = new SerialPort();
public Form1()
{
InitializeComponent();
serialPort.PortName = "Com1";
serialPort.BaudRate = 115200;
serialPort.DataReceived += new SerialDataReceivedEventHandler(DataRecievedHandler);
openSerial();
}
void DataRecievedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
MessageBox.Show(indata);
closeSerial();
}
public void openSerial()
{
if (!serialPort.IsOpen) serialPort.Open();
}
public void closeSerial()
{
if (serialPort.IsOpen) serialPort.Close();
}
private void button1_Click(object sender, EventArgs e)
{
openSerial();
serialPort.Write("Hello");
}
}
答案 1 :(得分:1)
您应该从不同的线程读取和写入串行端口。您可以将另一个线程旋转到ReadLine()
上阻止,或者您可以连接SerialDataReceivedEventHandler
以在数据到达串行端口时接收事件。
另请注意,保证为收到的每个字节都提出DataReceived
事件 。您需要使用BytesToRead
属性来检查缓冲区中的字节数。