2

发送命令后如何捕捉串口的返回?退货没问题。我如何阅读?我尝试使用 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();
            }
4

2 回答 2

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");

    }
}
于 2013-07-05T05:25:44.893 回答
1

您应该从不同的线程读取和写入串行端口。您可以旋转另一个线程来阻止,ReadLine()或者您可以连接SerialDataReceivedEventHandler以在数据到达串行端口时接收事件。

还要记住,不能保证每个接收到的字节都会引发DataReceived事件。您需要使用该属性来检查缓冲区中有多少字节。BytesToRead

于 2013-07-05T05:25:33.523 回答