Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 后台串口读取循环_C#_While Loop_Serial Port - Fatal编程技术网

C# 后台串口读取循环

C# 后台串口读取循环,c#,while-loop,serial-port,C#,While Loop,Serial Port,有一个STM32设备,可在任何2秒钟内通过串行端口发送AES加密的十六进制数据。所有消息都以换行符结束。我的程序(带有用户界面,而不是控制台界面)能够读取串行数据并解密数据,即使在循环中仍然工作良好,但问题是在循环中我不能使用断开连接功能,因此我的程序停留在“无限循环”中。 下面是一个代码: public void button1_Click(object sender, EventArgs e) { try { serialPort1.PortName = c

有一个STM32设备,可在任何2秒钟内通过串行端口发送AES加密的十六进制数据。所有消息都以换行符结束。我的程序(带有用户界面,而不是控制台界面)能够读取串行数据并解密数据,即使在循环中仍然工作良好,但问题是在循环中我不能使用断开连接功能,因此我的程序停留在“无限循环”中。 下面是一个代码:

public void button1_Click(object sender, EventArgs e)
{
    try 
    {
        serialPort1.PortName = cBoxComPort.Text;
        serialPort1.BaudRate = 9600;
        serialPort1.DtrEnable = true;
        serialPort1.ReadTimeout = 5000;
        serialPort1.WriteTimeout = 500;
        serialPort1.Open();
        lblStatusCom.Text = "Connected";
        lblMessage.Text = "I am on!";

        while (serialPort1.IsOpen)
        {
            string mgs1 = serialPort1.ReadLine();
            byte[] key = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F };
            byte[] enc = StringToByteArray(mgs1);
            byte[] dec = Decrypt(enc, key);
            lblMessage.Text = getString(dec);
        }
    }
    catch(Exception err)
    {
        MessageBox.Show(err.Message,"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        //lblStatusCom.Text = "Disconnected";
    }
}

如何才能将此循环过程“置于后台”,以便用户如果希望退出阅读,可以单击以断开连接?

以下是使用DataReceived事件的版本:

单击按钮,您将打开端口并注册事件

public void button1_Click(object sender, EventArgs e)
{
    try 
    {
        serialPort1.PortName = cBoxComPort.Text;
        serialPort1.BaudRate = 9600;
        serialPort1.DtrEnable = true;
        serialPort1.ReadTimeout = 5000;
        serialPort1.WriteTimeout = 500;
        serialPort1.Open();
        lblStatusCom.Text = "Connected";
        lblMessage.Text = "I am on!";

        serialPort1.DataReceived += portDataReceived;

    }
    catch(Exception err)
    {
        MessageBox.Show(err.Message,"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        //lblStatusCom.Text = "Disconnected";
    }
}

private void portDataReceived(object sender, EventArgs args)
{
    SerialPort port = sender as SerialPort;

    if (port == null)
    {
        return;
    }

    string mgs1 = port.ReadLine();
    byte[] key = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F };
    byte[] enc = StringToByteArray(mgs1);
    byte[] dec = Decrypt(enc, key);
    if (lblMessage.InvokeRequired)
    {
        lblMessage.Invoke(new Action(()=> lblMessage.Text = getString(dec)));
    }
    else
    {
        lblMessage.Text = getString(dec);
    }
}

设备是否定期发送数据?您也可以使用事件来执行此操作。这里一个重要的事情是,如果你把它放在另一个线程上,你不能简单地操作GUI控件,比如
lblMessage.Text=getString(dec)因为它们在另一个线程上。你需要使用@Mong-Zhu,程序会在任何2秒钟内发送一条以换行符结尾的长行(大约200个字符)。“打印到串行”的时间是几毫秒。接收到的数据是否可以在这种情况下使用,或者最好放在后台?“程序在任何2秒钟内发送”是否每2秒钟发送一个字符串?比如1:10,1:12,1:14等等@Mong Zhu是的,每2秒钟更正一次。@Mong Zhu,谢谢您现在将首先阅读DataReceived部分,然后阅读您发送给我的调用数据。谢谢你的时间和帮助!你好我现在已经测试了代码,并且工作得非常出色!好多了!