1

我有一个 Arduino 板,它通过 Xbee 模块将一些传感器读数无线传输到串行 USB 模块。我编写了以下代码来读取该数据:

    public partial class Debugger : Page
{
    public static string comportnum;
    public delegate void NoArgDelegate();
    public static SerialPort serialX;
    public Debugger()
    {
        InitializeComponent();
        comportnum = "";
    }

    private void ActualButton_Click(object sender, RoutedEventArgs e)
    {
        comportnum = "COM" + comport.Text;

        serialX = new SerialPort(comportnum);
        serialX.BaudRate = 9600;
        try
        {
            serialX.Open();

            serialX.DataReceived += new SerialDataReceivedEventHandler(serialX_DataReceived);
        }
        catch (Exception)
        {
            MessageBox.Show("Houston, we have a problem.");
            //throw;
        }
    }

    void serialX_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {

        MessageBox.Show("Ping");           
        readingStuff();

    }
    void readingStuff()
    {

        String comdata;
        base.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, (NoArgDelegate)delegate
        {
            DebugWindow.Text += "Data";
            comdata = serialX.ReadLine();
            DebugWindow.Text += "\n" + comdata + "\n";
        });
    }

}

只要我有那个 MessageBox.Show("Ping"),它就可以工作。没有它,应用程序会冻结/崩溃。当它冻结/崩溃时,没有运行时错误。即使在调试时,Visual Studio 也会继续运行,但是我无法单击 WPF 应用程序的任何其他按钮,甚至无法单击 WPF 应用程序上的关闭按钮。

我需要想出一种方法来确保顺利读取数据而不会出现任何中断,而不必使用 MessageBox。

4

1 回答 1

2

只是一个猜测,但尝试像这样修改您的读取方法:

void readingStuff()
{
    String comdata = serialX.ReadLine();
    Dispatcher.Invoke((Action)(() => DebugWindow.Text += "Data\n" + comdata + "\n" ));
}

这将异步读取数据(在调用 Dispatcher 之前),并通过使用Invoke而不是BeginInvoke确保在读取下一个数据块之前完成更新 UI(假设SerialPort.DataReceived没有同时调用)。

于 2013-07-16T06:04:52.093 回答