ruan923 2018-09-17 02:42 采纳率: 0%
浏览 732

Wpf 串口通讯,更新uI后,关闭串口会卡死,怎么解决?

  /// <summary>
    /// 串口数据,接收事件
    /// </summary>
private void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        if (Closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环
        try
        {
            Listening = true;//设置标记
            int n = comm.BytesToRead;
            byte[] buf = new byte[n];//当前的串口数据
            comm.Read(buf, 0, n);//读取缓冲数据
            BufferList.AddRange(buf); //1.缓存数据    
            if (BufferList == null || BufferList.Count() == 0)
            {
                return;
            }
            var resultASCII = new ASCIIEncoding().GetString(buf);//转为ASCII码
            returnStr += resultASCII;
            //返回命令处理
            ReturnCmdDispose();
            AssessmentCom();
        }
        catch (Exception w)
        {
            LogHelper.WriteLogAndInfo("串口接收事件发生异常:" + w.Message);
            returnStr = string.Empty;
        }
        finally
        {
            Listening = false;//我用完了,ui可以关闭串口了。
        }
    }
 private void AssessmentCom()
        {
            //一条有效的肌电指令有11位,包含(开头1位/类型1位/排序号1位/A1、E 4位/A2 4位)
            while (BufferList.Count >= 11)//至少要包含头(2字节)+长度(1字节)+校验(1字节)
            {
                //FF(255)代表开头 FE(254)代表肌电  FD(253)代表压力
                if (BufferList[0] == 255 && (BufferList[1] == 254 || BufferList[1] == 253))
                {
                    BufferList.CopyTo(3, binary_data_1, 0, 4);//复制一条完整数据到具体的数据缓存
                    BufferList.CopyTo(7, binary_data_2, 0, 4);

                    BufferList.RemoveRange(0, 11);//正确分析一条数据,从缓存中移除数据。
                    lock (thisLock)
                    {
                        secondDisplay = secondDisplay + 7;
                        float _second = (float)Math.Round(secondDisplay / 100, 2);
                        float valueA1 = 0f;//4个byte8位,就是32位,转为32位的float类型,也就是打点的值
                        float valueA2 = 0f;

                        if (binary_data_1 != null) valueA1 = SetSerialPortDataList(binary_data_1, 1, _second);
                        if (binary_data_2 != null) valueA2 = SetSerialPortDataList(binary_data_2, 0, _second);
                        //界面处理
                        if (MyoelectricityCollect != null)
                        {
                            MyoelectricityCollect(Math.Round(valueA1, 2), Math.Round(valueA2, 2));
                        }
                    }
                }
                else
                {
                    //这里是很重要的,如果数据开始不是头,则删除数据
                    BufferList.RemoveAt(0);
                }
            }
        }

double runTime = 0d;
private void Spcom_MyoelectricityCollect(double A1E, double A2)
{
try
{
this.Dispatcher.Invoke(new Action(() =>//委托操作GUI控件的部分
{
if (currentUserControl is BiofeedbackUserControl)
{
BiofeedbackUserControl biofeedback = currentUserControl as BiofeedbackUserControl;
double curentValue = 0d;//实时打点值
if (runTime > maxTime || isReset)//设置当前模板曲线一屏为10秒,大于10秒,从第一个点开始\或重新调整
{
isReset = false;
runTime = 0d;
Reset();
}

                    if (biofeedback != null)
                    {
                        var currentModel = biofeedback.Tag as TestDataModel;

                        curentValue = currentModel.AisleInfo == "A2" ? A2 : A1E;
                        double[] val = new double[] { Math.Round(runTime, 2), Math.Round(curentValue, 2), Math.Round(0d, 2) };
                        biofeedback.CurrentValTime = val;
                    }
                }
            }));
            runTime = runTime + PublicVar.timeDot;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString(), "提示");
        }
    }

/// 关闭串口
/// 关闭串口将停止所有指令
///
public void CommClose()
{
try
{
//eleWatch.Restart();
//while (eleWatch.Elapsed.TotalMilliseconds <= 8) { }
//eleWatch.Stop();
if (comm.IsOpen)
{
Closing = true;
while (Listening)
{
System.Windows.Forms.Application.DoEvents();
};
//打开时点击,则关闭串口
comm.Close(); //zcx_err comm 未将对象引用到实例
Closing = false;
secondDisplay = 0.0d;
returnStr = string.Empty;
BufferList.Clear();
}
}
catch (Exception w)
{
LogHelper.WriteLogAndInfo("串口关闭发生异常:" + w.Message);
}
finally
{

        }
    }
  • 写回答

1条回答

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-10-27 15:54
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题