簡體   English   中英

C#串行數據接收事件調用功能無法正常工作

[英]C# Serial DataReceived Event Invoke Function Not Working Properly

我制作了一個winform程序來從串行端口讀取數據並將其顯示在文本框中。 每隔5秒從外部設備發送一次數據。 第一個數據是“ 1,然后是” 2”,然后是“ 3”,並永遠重復相同的模式。
我將使pictureBox1,pictureBox2,pictureBox3可見,並在分別接收到數據“ 1”,“ 2”和“ 3”時播放gif。 問題是,有時即使下一個數據到達,pictureBox也不會切換到下一個相應的圖像。 我不確定我是否正確使用了invoke函數?

public Form1()
{
    InitializeComponent();
    SerialPortProgram();
    pictureBox1.Image=
    Image.FromFile(@"C:\Users\user\Downloads\Gif#1.gif");
    pictureBox2.Image = 
    Image.FromFile(@"C:\Users\user\Downloads\Gif#2.gif");
    pictureBox3.Image = 
    Image.FromFile(@"C:\Users\user\Downloads\Gif#3.gif");
}

// Create the serial port with basic settings
private SerialPort port = new SerialPort("COM17", 9600, Parity.None, 8, StopBits.One);

private void SerialPortProgram()
{
    // Attach a method to be called when there
    // is data waiting in the port's buffer
    port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

    // Begin communications
    port.Open();

    // Enter an application loop to keep this thread alive
    // Application.Run();        // if this Application.Run() is not commented out, Form1 will not be displayed
}

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // Show all the incoming data in the port's buffer
    string data = (port.ReadExisting());
    Log(data);
    if (data == "1")
    {
        gif1Showl();
    }

    if (data == "2")
    {
        gif2Show();
    }

    if (data == "3")
    {
        gif3Show();
    }
}


private void Log(string msg)
{
    textBox1.Invoke(new EventHandler(delegate
    {
        textBox1.AppendText(msg);
    }));
}

private void gif1Showl()
{
    this.Invoke(new ThreadStart(() =>
    {
        pictureBox1.Visible = true;
        pictureBox1.Enabled = true;
        pictureBox2.Visible = false;
        pictureBox2.Enabled = false;
        pictureBox3.Visible = false;
        pictureBox3.Enabled = false;
    }));
}

private void gif2Show()
{
    this.Invoke(new ThreadStart(() =>
    {
        pictureBox1.Visible = false;
        pictureBox1.Enabled = false;
        pictureBox2.Visible = true;
        pictureBox2.Enabled = true;
        pictureBox3.Visible = false;
        pictureBox3.Enabled = false;
    }));
}

private void gif3Show()
{
    this.Invoke(new ThreadStart(() =>
    {
        pictureBox1.Visible = false;
        pictureBox1.Enabled = false;
        pictureBox2.Visible = false;
        pictureBox2.Enabled = false;
        pictureBox3.Visible = true;
        pictureBox3.Enabled = true;
    }));
}

您應該檢查是否需要調用並致電您的代表。 創建新線程來更新UI本身是錯誤的。

MethodInvoker methodInvokerDelegate = delegate() 
{ 
    pictureBox1.Visible = false;
    pictureBox1.Enabled = false;
    pictureBox2.Visible = false;
    pictureBox2.Enabled = false;
    pictureBox3.Visible = true;
    pictureBox3.Enabled = true; 
};

//This will be true if Current thread is not UI thread.
if (this.InvokeRequired)
    this.Invoke(methodInvokerDelegate);
else
    methodInvokerDelegate();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM