C# 后台串口读取循环
有一个STM32设备,可在任何2秒钟内通过串行端口发送AES加密的十六进制数据。所有消息都以换行符结束。我的程序(带有用户界面,而不是控制台界面)能够读取串行数据并解密数据,即使在循环中仍然工作良好,但问题是在循环中我不能使用断开连接功能,因此我的程序停留在“无限循环”中。 下面是一个代码: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
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部分,然后阅读您发送给我的调用数据。谢谢你的时间和帮助!你好我现在已经测试了代码,并且工作得非常出色!好多了!