// 按下初始化按钮之后执行的操作,即:发送连接状态查询帧。 private void InitializeButton_Click(object sender, RoutedEventArgs e) { // 确认串口已经被打开 if (serial != null && serial.rs232.ComPortIsOpen) { // 按钮被按下后进行初始化,发送对应的帧 // 第一次被按下的时候现实性初始化相关字样 if (!is_initialized) { _output.AppendLine("Initialize process activated." + Environment.NewLine + "Initializing..." + Environment.NewLine + Environment.NewLine); is_initialized = true; } // 准备好要发送的帧 ConnectionStatusInquiryFrame frames_inq = new ConnectionStatusInquiryFrame(); // 做好帧的赋值工作(这个帧的值都是确定的) // 字符串保存即将发出去的帧内容,然后显示 string outStr = frames_inq.FrameBytesInString(); _output.AppendLine("Sending inquiry frame......Content: " + outStr + Environment.NewLine + Environment.NewLine); TheTextBox.ScrollToEnd(); // 注册等待接收事件 serial.rs232.rsr.NewFrame += ComFrameUp; // 调用发送方法将其发给串口 frames_inq.SendFrame(serial); } else { MessageBox.Show("未打开串口。"); return; } }
private void TestButton2_Click(object sender, RoutedEventArgs e) { // 确认串口已经被打开 if (serial != null && serial.rs232.ComPortIsOpen) { // 按钮被按下后发送对应的测试帧 // 准备好要发送的帧 PortParameterInquiryFrame frames_portpara_inq = new PortParameterInquiryFrame(); // 做好帧的赋值工作(这个帧的值都是确定的) // 字符串保存即将发出去的帧内容,然后显示 string outStr = frames_portpara_inq.FrameBytesInString(); _output.AppendLine("Sending test frame......Content: " + outStr + Environment.NewLine + Environment.NewLine); TheTextBox.ScrollToEnd(); // 注册等待接收事件 serial.rs232.rsr.NewFrame += ComFrameUp; // 调用发送方法将其发给串口 frames_portpara_inq.SendFrame(serial); } else { MessageBox.Show("未打开串口。"); return; } }
}; // 先默认他是四个 // 当下层帧来的时候在这儿显示一下原始内容 private void ComFrameUp(object sender, FrameReceivedArgs e) { // 如果不用下面这一行,我想要的对象还被子线程所拥有,无法用来改变UI层的元素 // 按这一行这样操作一下就可以了。虽然我也不清楚为什么,C#这边还需要学习。 // 参考了https://blog.csdn.net/u014117094/article/details/47776165 Dispatcher.Invoke(new Action(() => { _output.AppendLine("Frame received: " + e.IncomingFrame + Environment.NewLine + Environment.NewLine); TheTextBox.ScrollToEnd(); // 调用FrameClassifier来解析帧 FrameClassifier.IncomingFrameTypes result; FrameClassifier classifier = new FrameClassifier(); result = classifier.RunClassifier(e.IncomingFrameBytes); ProcessClassifyResult(result, e.IncomingFrameBytes); })); // 显示一次之后就取消委托,下次要再显示下次再添加委托。不然每次“初始化”都增加一个委托,每次都多显示一行同样的内容。 serial.rs232.rsr.NewFrame -= ComFrameUp; }