【问题标题】:serial port reading multiple lines串口读取多行
【发布时间】:2019-02-04 15:59:26
【问题描述】:

我有一块板子,我想与之交流。当我给它一些命令时,它应该返回字符串消息并应该在文本框中发布。我的问题是当设备必须返回多行文本时,只有 1 行被发布。我也尝试过使用 ReadExisting 而不是 ReadLine 但在一个命令之后我只得到空字符串。

public partial class Form1 : Form        
{
    private string x;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        serialPort1.Open();
        timer1.Start();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        serialPort1.WriteLine(textBox1.Text);
        textBox1.Clear();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {

        if (String.IsNullOrEmpty(x))
        {

        }
        else
        {
            textBox2.AppendText(x + "\n\r");
            x = "";
        }

    }

    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        x = serialPort1.ReadLine();
        //x = serialPort1.ReadExisting();
    }

    private void Form1_Closing(object sender, EventArgs e)
    {
        serialPort1.Close();
        timer1.Stop();
    }

    private void textBox2_TextChanged(object sender, EventArgs e)
    {

    }
}

【问题讨论】:

  • 你应该使用x += serialPort1.ReadExisting();,否则(没有+=)你将覆盖已经读取的数据。

标签: c# serial-port


【解决方案1】:

最好避免使用DataReceived,而只使用BaseStream。像这样:

private async void Form1_Load(object sender, EventArgs e)
{
    serialPort1.Open();
    using (var reader = new StreamReader(serialPort1.BaseStream)) {
         while (serialPort1.IsOpen) {
             string x = await reader.ReadLineAsync();
             textBox2.AppendText(x + "\r\n");
         }
    }
}

await 关键字以静默方式管理与 UI 线程的同步——您不需要 Invoke,不会出现跨线程故障,不会触发对事件处理程序的第二次调用当第一个仍在运行时,您不会从访问同一变量的多个线程中获得竞争条件。更容易做对。

作为一个样式问题,我不会将此代码直接放在您的表单Load 事件处理程序中,我会将它放在一个适当命名的辅助函数中(可能是OpenAndReadSerial())并从覆盖的OnLoad() 中调用它。

【讨论】:

  • 并确保设备实际发送“换行符”。
  • @Fildor:当然。如果没有,BaseStream 本身和StreamReader 上还有其他ReadAsync 类型的函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 2023-04-03
  • 2013-09-24
  • 1970-01-01
  • 2013-09-09
  • 2016-09-26
  • 1970-01-01
相关资源
最近更新 更多