您好我正在尝试编写一个简单的 C# WPF,它可以从计时系统实时在虚拟记分板上显示时间信息。我对编程相当陌生,因此将不胜感激。
我创建了一个新线程来处理来自 COM 端口的传入数据,并且随着应用程序的开发,这些数据将被解释。现在我只想将来自计时器的原始信息(十六进制)显示到文本框中。这有效,但不符合预期。我收到了大量重复的信息,我唯一的解释是我读取数据太慢或者它一遍又一遍地读取相同的字节。我想要做的是取出每个字节并显示它们,所有这些都由一个开始/停止按钮控制。
可能的解决方案包括将整个缓冲区存储在我还不太确定的列表或数组中,我不想添加太多线程以使程序冻结所有内容。
到目前为止,这是我的代码(我对我在这里编写的几乎所有代码都是新手,所以如果有什么不好的做法,请告诉我):
public partial class MainWindow : Window
{
SerialPort comms;
Thread commThread;
bool flag;
string message;
public MainWindow()
{
InitializeComponent();
comms = new SerialPort();
}
private void PortControl_Click(object sender, RoutedEventArgs e)
{
if (!comms.IsOpen)
{
PortControl.Content = "Stop";
comms.PortName = "COM1";
comms.BaudRate = 9600;
comms.DataBits = 8;
comms.StopBits = StopBits.One;
comms.Parity = Parity.Even;
comms.ReadTimeout = 500;
comms.ReceivedBytesThreshold = 1;
commThread = new Thread(new ThreadStart(Handle));
comms.Open();
comms.DataReceived += new SerialDataReceivedEventHandler(ReadIn);
}
else
{
PortControl.Content = "Start";
flag = false;
comms.DataReceived -= ReadIn;
commThread.Join();
comms.Close();
}
}
private void ReadIn(object sender, SerialDataReceivedEventArgs e)
{
if (!commThread.IsAlive)
{
flag = true;
commThread.Start();
}
}
private void Handle()
{
while (flag)
{
if (comms.IsOpen)
{
try
{
message = comms.ReadByte().ToString("X2");
Dispatcher.BeginInvoke((Action)(() =>
{
ConsoleBox.Text += message + " ";
}));
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
}
}