我正在为物理课开展一个项目,并希望尝试将应用程序放在一起执行以下操作。测试单元上有一个串行端口,以1 Hz的频率输出数据。我想有一个应用程序,它将读取串口数据并将其保存到文件中。我在控制台应用程序中创建了它,它工作正常。现在,我想要一个GUI。在GUI的主屏幕上,我想要几个复选框。用户可以在输入数据流中添加时间戳,一个用于将数据输出到文本文件,也可以是将数据发送到石墨图形服务器的时间戳。
所以,我在这里寻找一些指示。现在,我有一个连接按钮。按下时,它会打开串口并执行serial.readline()但是如果当前没有数据通过链接推送,则应用程序将被锁定。所以我假设我需要使用线程。这听起来不错吗?
最后,我该如何处理复选框?我想要4个按钮。连接/断开录制/暂停。至少这些是我的想法。
答案 0 :(得分:1)
而不是为串行端口创建线程只是挂钩DataReceived事件。
关于挂钩到CheckedChanged事件的复选框。
所以它看起来像:
private bool paused;
private SerialPort sp;
public Form1()
{
InitializeComponent();
sp = new SerialPort();
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
}
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (!paused)
{
string indata = sp.ReadExisting();
//Display the data
//To avoid cross thread problems do something like this
Invoke(new Action(() =>
{
textBox1.Text += indata;
}));
//Or if you are just writing to the console
Console.WriteLine(indata); //Thread safe
//Timestamp checkbox
if (checkBox3.Checked)
{
//Display timestamp using DateTime.Now
}
//Write to file checkbox
if (checkBox4.Checked)
{
using (StreamWriter file = new StreamWriter(path, true))
{
file.WriteLine(indata);
}
}
}
}
//Pause/Resume Checkbox
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
paused = checkBox1.Checked;
}
//Connect/Disconnect checkbox
private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
if (checkBox2.Checked)
{
sp.Open();
}
else
{
sp.Close();
}
}