在startbutton_Click()函数内的while循环中接收串行端口数据

本文关键字:循环 while 数据 串行端口 startbutton Click 函数 | 更新日期: 2023-09-27 18:25:18

我从中创建了一个wpf,每次从串行端口获得两个字节时,我都会在其中找到它们之间的差异,然后在while循环中,我通过文本框显示差异:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
    }
    SerialPort port;
    private void StartButton_Click(object sender, RoutedEventArgs e)
    {
        port = new SerialPort("COM3");
        port.BaudRate = 9600;
        port.DtrEnable = true;
        port.RtsEnable = true;
        port.Handshake = Handshake.None;
        port.Open();
        try
        {
            if (!port.IsOpen)
                throw new Exception();
        }
        catch (Exception)
        {
            Console.Out.WriteLine("port is not open!!");
        }
        while (port.IsOpen)
        {
            var b1 = port.ReadByte();
            var b2 = port.ReadByte();
            double t1 = b1 * 1e-9;
            double t2 = b2 * 1e-9; ;
            var dift = t2 - t1;
            if (dift == 0)
            {
                this.SpeedTextBox.Text = "0";
                continue;
            }
            this.SpeedTextBox.Text = dift;
        }
    }
    private void StopButton_Click(object sender, RoutedEventArgs e)
    {
        if (port != null)
        {
            if (port.IsOpen) port.Close();
            port.Dispose();
        }
    }
}

但当我执行它并点击StartButton时,表单将停止工作。我知道这个程序接收数据(我用另一个简单的程序测试了它)。但我不知道这里出了什么问题!!

有人能帮我吗?

提前谢谢。

在startbutton_Click()函数内的while循环中接收串行端口数据

ReadByte()是一个阻塞方法,它在收到字节之前不会返回。这就是SerialPort发生DataReceived事件的原因。

首先使用另一个程序,如Hyperterminal或Putty来测试连接,并消除简单的错误,如接线错误、选择错误的端口号或波特率以及Parity、DataBits和StopBits设置错误。你没有设置,所以有非零的几率,你会得到框架错误。您必须实现ErrorReceived事件,以确保这些错误不会被忽视,并让您困惑它为什么不起作用。

如果您不使用DataReceived,那么使用ReadTimeout属性也很重要,以确保您的程序不会永远挂起,如果连接出现问题,则无法诊断原因。准备好捕捉TimeoutException。

SysInternals的PortMon是一个非常有用的工具,可以比较好与坏,它可以准确地向您显示串行端口驱动程序内部的情况。但是要注意,它不能在64位操作系统上运行。

Hans已经介绍了串行端口的情况,但程序将锁定的另一个原因是您的单击处理程序使用了无限等待循环。Windows应用程序的工作方式是,它们有一个从队列中获取消息(如单击事件)的主循环。对于每条消息,都会调用事件处理程序,只有当事件处理程序将控制权返回到主循环时,它才能处理下一条消息(例如,重新绘制窗口并显示您在控件上设置的新文本)。因此,如果您希望程序对用户输入保持响应,就不能在事件处理程序中使用长循环或阻塞调用。