C#Serial DataReceived事件调用函数无法正常工作

时间:2017-12-08 06:32:08

标签: c# event-handling serial-port picturebox invoke

我创建了一个winform程序,用于从串口读取数据并将其显示在文本框中。数据将每隔5秒从外部设备发送一次。第一个数据是“1后跟”2“然后是”3“并永远重复相同的模式 当数据“1”,“2”和“3”分别收到时,我将使pictureBox1,pictureBox2,pictureBox3可见并播放gif。问题是有时候即使下一个数据到达,pictureBox也不会切换到下一个相应的。我不确定我是否正确使用了调用函数?

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

1 个答案:

答案 0 :(得分:0)

您应该检查是否需要调用并致电您的代理人。创建一个新线程来更新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();