后台串口读取循环
Serial port reading loop in background
有一个STM32设备,每2秒通过串行端口发送一个AES加密的十六进制数据。所有消息都以换行结束。我的程序(带有用户界面,而不是控制台程序)能够从串行读取并解密数据,即使在循环中仍然运行良好,但问题是在循环中我不能使用断开连接功能,所以我的程序留在 "infinite loop"。
这是一个代码:
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";
}
}
我如何"put to background"这个循环过程,以便用户可以单击断开连接,如果他想退出阅读?
这是一个使用 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);
}
}
有一个STM32设备,每2秒通过串行端口发送一个AES加密的十六进制数据。所有消息都以换行结束。我的程序(带有用户界面,而不是控制台程序)能够从串行读取并解密数据,即使在循环中仍然运行良好,但问题是在循环中我不能使用断开连接功能,所以我的程序留在 "infinite loop"。 这是一个代码:
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";
}
}
我如何"put to background"这个循环过程,以便用户可以单击断开连接,如果他想退出阅读?
这是一个使用 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);
}
}