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日

相关文章

  • C#获取本机IP地址(ipv4)

    获取本机IP地址是在编程过程中常用的功能之一,本文将详细讲解如何使用C#获取本机IP地址(ipv4)。 获取本机IP地址的代码 下面是获取本机IP地址的C#代码: using System.Net; using System.Net.Sockets; IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostN…

    C# 2023年6月7日
    00
  • 如何通过C#/VB.NET代码将PowerPoint转换为HTML

    利用PowerPoint可以很方便的呈现多媒体信息,且信息形式多媒体化,表现力强。但难免在某些情况下我们会需要将PowerPoint转换为HTML格式。因为HTML文档能独立于各种操作系统平台(如Unix,Windows等)。并且它可以加入图片、声音、动画、影视等内容,还能从一个文件跳转到另一个文件,与世界各地主机的文件连接。通过HTML可以表现出丰富多彩的…

    C# 2023年5月5日
    00
  • Asp.net(C#)实现验证码功能代码

    接下来我将为您详细讲解Asp.net(C#)实现验证码功能代码的完整攻略。 1. 简介 验证码,就是为了防止恶意机器人向网站提交请求或恶意注册而设计的一种验证方法。通过验证码,网站可以判断请求来源的真实性并提高安全性。 2. 实现过程 首先,我们需要生成一个随机的验证码,并将其显示在前台;其次,用户需要输入验证码并进行验证。下面,我将分两部分进行详细讲解。 …

    C# 2023年5月31日
    00
  • C#中的==运算符

    当我们在C#中使用“==”运算符时,它主要用于比较两个值或者引用类型对象是否相等。 在C#中,基础类型如int、double、bool等都是值类型,使用“==”运算符时会比较它们的值是否相等,例如: int a = 1; int b = 1; bool result = a == b; // result为true,因为a和b的值相等 而引用类型如strin…

    C# 2023年5月14日
    00
  • c# 实现计时器功能

    下面是c#实现计时器功能的完整攻略: 1. 创建计时器控件 首先需要创建一个计时器控件,可以实现计时器的各种功能。计时器控件可以通过Visual Studio的工具箱来添加,或者在代码中创建。创建计时器控件的方法: // 创建计时器控件 Timer timer = new Timer(); 2. 设置计时器控件属性 在创建计时器控件之后,需要设置计时器控件的…

    C# 2023年6月1日
    00
  • Angular4 反向代理Details实践

    Angular是一种流行的Web应用程序框架,它提供了许多功能和工具来帮助开发人员构建高效的Web应用程序。在开发Angular应用程序时,我们可能需要使用反向代理来解决跨域请求的问题。本文将提供详解“Angular4反向代理Details实践”的完整攻略,包括如何配置反向代理、如何在Angular应用程序中使用反向代理等。 配置反向代理 要配置反向代理,我…

    C# 2023年5月15日
    00
  • C#绘图基本方法实例总结

    C#绘图基本方法实例总结 简介 本篇文章主要介绍C#绘图基本方法的实例总结,包括绘制线条、矩形、圆形、椭圆等基本图形的实现方法,同时介绍了如何使用画刷、画笔等一些绘图工具来实现更加丰富的效果。 绘制线条 使用Graphics对象绘制线条,可以使用以下方法: public void DrawLine(Pen pen, int x1, int y1, int x…

    C# 2023年6月1日
    00
  • asp.net 读取xml文件里面的内容,绑定到dropdownlist中

    下面是详细讲解“asp.net读取xml文件里面的内容,绑定到dropdownlist中”的完整攻略。 1. 读取XML文件 我们可以使用System.Xml命名空间中的XmlDocument类来读取XML文件。首先,我们需要创建一个XmlDocument对象,并调用它的Load方法来加载XML文件。 XmlDocument xmlDoc = new Xml…

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