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/p/17367846.html

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

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

相关文章

  • C#中数组Array,ArrayList,泛型List详细对比

    下面我就为大家详细讲解“C#中数组Array,ArrayList,泛型List详细对比”的攻略: 1. 基本概念介绍 数组Array:数组是具有相同类型的一组元素集合。数组的大小不能改变,且必须在声明后定义其大小。数组支持多维,其中第一维是最高维度。 ArrayList:ArrayList 是一个可变大小的数组,可以根据需要动态调整其大小。ArrayList…

    C# 2023年5月15日
    00
  • ASP.NET MVC @Helper辅助方法和@functons自定义函数的使用方法

    ASP.NET MVC提供了@Helper辅助方法和@Functions自定义函数来简化视图中的重复代码和处理逻辑,更好地实现页面渲染。以下是使用方法的完整攻略。 1. @Helper辅助方法的使用 @Helper辅助方法是一个在Razor视图中定义的,可以在其他视图中调用的函数,用来处理通用逻辑和代码。要使用@Helper辅助方法,请按照以下步骤进行: 1…

    C# 2023年5月31日
    00
  • ASP.Net Core中使用枚举类而不是枚举的方法

    ASP.Net Core是一个开源的Web应用程序框架,支持多种操作系统和平台。其中使用枚举类而不是枚举的方法,可以使代码更加可读,可维护和可扩展。 1.枚举类的定义 在ASP.Net Core中定义枚举类可以使用如下方法: public class CardSuit { public const int Hearts = 0; public const i…

    C# 2023年6月6日
    00
  • 通过隐藏option实现select的联动效果

    当我们需要实现 select 元素之间的联动效果时,往往需要使用 JavaScript 动态改变 select 的 options。但实际上,我们也可以通过设置option的隐藏与显示来实现联动效果。 下面是通过隐藏 option 实现 select 的联动效果的完整攻略: 步骤一:编写 HTML 结构 首先我们需要编写 HTML 结构,包含所有要联动的 s…

    C# 2023年6月1日
    00
  • Android实现横屏切换科学计算器

    Android实现横屏切换科学计算器攻略 介绍 在Android应用中实现横屏切换,能够提升用户体验,特别是在进行科学计算的时候。在横屏模式下,可以修改应用的布局,增加更多的控件和功能。本文将详细讲解如何实现在Android应用中实现横屏切换的科学计算器。 实现步骤 首先需要定义两种不同的布局文件,一种布局用于竖屏模式,另一种用于横屏模式。命名方式应该为: …

    C# 2023年6月7日
    00
  • Winform ComboBox如何独立绘制下拉选项的字体颜色

    要实现Winform ComboBox独立绘制下拉选项的字体颜色,可以采用以下步骤: 1. 继承ComboBox并重写OnDrawItem方法 我们需要自定义一个ComboBox控件,继承原有的ComboBox并重写OnDrawItem方法。在这个方法中,我们可以为每个下拉选项单独设置字体颜色。 public class CustomComboBox : C…

    C# 2023年6月6日
    00
  • C#中如何利用正则表达式判断字符

    下面是关于 C# 中利用正则表达式判断字符的攻略: 判断单个字符是否匹配正则表达式 在 C# 中,可以利用 Regex.IsMatch() 函数来判断一个字符串是否匹配某个正则表达式。如果需要判断单个字符是否符合正则表达式,需要先将该字符转换为字符串,然后再调用 Regex.IsMatch() 进行判断。示例如下: char c = ‘A’; // 需要判断…

    C# 2023年6月6日
    00
  • C#如何让winform程序中的输入文本框保留上次的输入

    要让WinForm程序中的输入文本框保留上次的输入,一种比较常见的方法是使用应用程序设置(Application Settings),下面我将提供具体的攻略。 第一步:启用应用程序设置 在Visual Studio中打开你的WinForm项目; 打开项目属性窗口(可以通过在解决方案资源管理器中右键单击项目并选择“属性”或者通过菜单栏的“项目”->“属性…

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