WPF 调用 ECAN 发送数据会阻塞的解决过程

接了个活, 写个 WPF 上位机用 PCAN 或 ECAN 和单片机通讯, 读取传感器数据.

程序逻辑是 : 选择连接类型 PCAN / ECAN, 选择波特率, 选择通道号, 输入查询间隔, 连接设备. 然后开启一个后台线程循环发送读取指令逐个读取传感器数据.

使用 PCAN 时, 连接和收发数据都正常, 但改为 ECAN 连接后, 有很大几率卡在 SDK 的发送函数那.

查看厂商提供的 WinForm demo ,有调用界面定时器来收发数据和在后台开线程来收发数据两种, 我把在后台开线程收发的 Demo 改成了程序的收发逻辑, 测试发现也会卡在SDK的发送函数那里, 我就把在线程里收发数据改成了调用 UI 线程收发数据

1 Dim result As Boolean
2 MainWindowInstance.Dispatcher.BeginInvoke(Sub()
3                                               result = Ecan.Transmit(1, 0, AppSettingHelper.CANChanelId, sendMsg, 1) = Ecan.ECANStatus.STATUS_OK
4                                               SendOrReceiveEvent.Set()
5                                           End Sub)
6 SendOrReceiveEvent.WaitOne(1000)
7 Return result

能正常收发数据, 不会卡在发送函数那, 算是初步解决了问题, 然后就打包发给甲方使用了.

之后咨询了设备厂商, 厂商那边也没有提供解决方法.

过了一段时间, 甲方反馈说单片机没返回数据软件就会死机.

添加日志输出, 看到软件一直在调用接收函数, 然后想起在后台线程里, 写的逻辑是发送读指令后, 尝试接收数据 1000 次, 超过 1000 次失败后就在界面显示当前传感器数据接受失败, 然后继续读取下一个传感器数据.

找到原因后, 就直接把 AutoResetEvent 的 WaitOne 超时改成 10 ms (因为单次数据收发耗时都在 1 ms内)

测试时界面显示 接收传感器数据失败, 就还原修改, 添加 Stopwatch 测试发送函数耗时.

发现连接设备后第一次发送数据耗时大约 500 ms, 之后的发送耗时都在 1 ms内.

然后我就用了一个笨方法, 加个变量来判断是否是连接后第一次发送数据, 是连接后第一次发送就超时 1000 ms, 否则超时 10 ms.

改完后甲方说了一句是不是初始化的问题

因为用 PCAN 连接时, 没有出现这种问题, 这两个设备最大的差异就是 PCAN 价格1500多, ECAN只有 400多.

我就在连接设备后延时了 1000 ms, 然后按最开始的逻辑在后台线程收发数据.

测试几次后发现 SDK 的发送函数不会再阻塞了.

最终原因是 ECAN 设备初始化比 PCAN 设备时间要长, 但没想到未初始化完成就会一直卡在 SDK 的发送函数那

原文链接:https://www.cnblogs.com/707wk/archive/2023/05/02/17367846.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:WPF 调用 ECAN 发送数据会阻塞的解决过程 - Python技术站

(0)
上一篇 2023年5月1日
下一篇 2023年5月2日

相关文章

  • WinForm实现为ComboBox绑定数据源并提供下拉提示功能

    WinForm实现为ComboBox绑定数据源并提供下拉提示功能的完整攻略如下: 步骤一:定义数据源 首先需要定义一个数据源,数据源可以是数组、集合、DataTable等形式。以下是一个字符串数组作为数据源的示例代码: string[] dataSource = {"Apple", "Banana", "Ch…

    C# 2023年6月7日
    00
  • C#解决汉诺塔问题DEMO

    介绍C#解决汉诺塔问题的完整攻略: 一、什么是汉诺塔问题? 汉诺塔问题是经典的递归问题之一,起源于印度传说中的一个古老传说。汉诺塔有三根柱子A、B、C,A柱子上有n个盘子,盘子大小不等,较大的在下边,较小的在上面。现在我们需要将A柱上的所有盘子移动到C柱子上,但是移动过程需要满足以下规则: 每次只能移动一个盘子; 盘子的移动必须经过B柱; 盘子的大小关系必须…

    C# 2023年6月3日
    00
  • C#使用Oracle.ManagedDataAccess.dll组件连接Oracle数据库

    C#使用Oracle.ManagedDataAccess.dll组件连接Oracle数据库 准备工作 安装Oracle数据库 下载Oracle.ManagedDataAccess.dll组件 可以在Oracle官网下载,或者在NuGet包管理器中搜索“Oracle.ManagedDataAccess”进行下载 步骤说明 在项目中添加Oracle.Manage…

    C# 2023年6月2日
    00
  • asp中用insert into语句向数据库插入记录(添加信息)的方法

    以下是详细讲解“asp中用insert into语句向数据库插入记录(添加信息)的方法”的完整攻略: 1. 连接数据库 在使用insert into语句插入记录之前,我们需要首先连接到数据库,使用ADODB.Connection对象可以实现数据库连接。连接数据库的代码如下: <% ‘Recordset对象用于存储和处理从数据库中检索出来的数据 Dim …

    C# 2023年5月31日
    00
  • Winform开发框架中如何使用DevExpress的内置图标资源

    在Winform开发框架中使用DevExpress内置图标资源可以为我们的软件提供美观的界面效果和更好的用户体验。 下面是详细的攻略: 步骤一:添加DevExpress控件库 我们首先需要添加DevExpress控件库,可以通过在Visual Studio的工具箱中右键单击并选择“选项” -> “工具箱” -> “选择工具箱项” -> “D…

    C# 2023年6月3日
    00
  • C#使用LINQ查询操作符实例代码(一)

    “C#使用LINQ查询操作符实例代码(一)”是一篇介绍C#中使用LINQ查询操作符的教程,该教程共包含以下几个部分: 简介 常见的查询操作符 LINQ查询操作符实例代码 下面分别对这几个部分进行详细讲解。 简介 该部分简单介绍了LINQ的定义和作用,以及本篇教程的目的和使用前提。重点在于说明了本教程需要读者具备一定的C#基础知识和对LINQ技术的了解。 常见…

    C# 2023年5月31日
    00
  • C# 基于NPOI操作Excel

    C#基于NPOI操作Excel 在C#中,我们可以使用NPOI操作Excel文件。NPOI是一个开源的.NET库,它提供了对Microsoft Office的读取和写入支持。在本文中,我们将介绍使用NPOI操作Excel的完整攻略。 安装NPOI 要使用NPOI,我们需要先安装它。我们可以通过NuGet安装NPOI。在Visual Studio中,依次打开”…

    C# 2023年5月31日
    00
  • C# Dynamic关键字之:解析dynamic就是Object

    C#中的Dynamic关键字可以用于在编译时不确定类型的情况下,让编译器推断类型并在运行时确定类型。在这种情况下,编译器将把Dynamic类型解析为Object类型。以下是关于C#中Dynamic关键字解析为Object类型的攻略: 动态类型 使用Dynamic关键字定义一个变量时,该变量将被视为动态类型,因为它可以代表任何类型。例如,在以下示例中,使用Dy…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部