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# 正则表达式 使用介绍

    C# 正则表达式使用介绍 什么是正则表达式 正则表达式是一种用来描述字符串模式的表达式。它可以用来匹配、查找、替换文本中的字符串,非常适用于数据处理、文本分析等方面。正则表达式的写法非常灵活,可以使用特定的符号来表示文本中的各种模式,并且可以进行组合、嵌套等操作。 C#中的正则表达式 C#中正则表达式的使用由System.Text.RegularExpres…

    C# 2023年6月7日
    00
  • .netcore 写快递100的快递物流信息查询接口的实现

    .NET Core实现快递100的快递物流信息查询接口 快递100是一个广受欢迎的快递物流信息查询网站,它提供了全国范围内的快递物流信息查询服务。本攻略将详细介绍如何使用.NET Core实现快递100的快递物流信息查询接口,并提供两个示例说明。 快递100 API 快递100提供了一组API,可以用于查询快递物流信息。其中,最常用的API是查询快递物流信息…

    C# 2023年5月17日
    00
  • 在ASP.NET 2.0中操作数据之七十三:用Managed Code创建存储过程和用户自定义函数(上部分)

    在ASP.NET 2.0中操作数据之七十三:用Managed Code创建存储过程和用户自定义函数(上部分) Managed Code是指能够在托管代码环境中运行的代码,与之相对的是Unmanaged Code,需要依赖于操作系统底层的API和COM组件等,而且不受托管代码环境控制,容易引起内存泄漏等问题。本文将介绍如何使用Managed Code创建存储过…

    C# 2023年5月31日
    00
  • 关于C# 5.0 CallerMemberName CallerFilePath CallerLineNumber 在.NET4中的使用介绍方法

    C# 5.0 CallerMemberName CallerFilePath CallerLineNumber 在.NET4中的使用介绍方法 在C# 5.0及以上版本中,通过使用CallerMemberName、CallerFilePath和CallerLineNumber特性,可以在方法内部获取调用该方法的成员、代码文件名以及代码行号等信息,便于对代码进行…

    C# 2023年6月1日
    00
  • .Net Core微服务rpc框架GRPC通信基础

    下面是详细的“.Net Core微服务rpc框架GRPC通信基础”的完整攻略,包括框架介绍、使用方法以及两条示例说明。 一、什么是GRPC? GRPC是Google开源的跨语言高性能的RPC(Remote Procedure Call,远程过程调用)框架。它使用Protocol Buffers作为数据序列化方式,支持多种语言的实现。 GRPC可以让你像调用本…

    C# 2023年6月3日
    00
  • c#入门之分支语句使用方法(三元运算符、if语句、switch语句)

    C#入门之分支语句使用方法 在C#中,分支语句可以根据不同的条件执行不同的程序代码块。本文将介绍三种常用的分支语句,包括三元运算符、if语句、switch语句,并提供相应的示例。 三元运算符 三元表达式是一种紧凑的if语句形式,它可以用单行代码代替if-else语句。它的格式如下: result = condition ? expressionIfTrue …

    C# 2023年6月7日
    00
  • c#一个定时重启的小程序实现代码第1/2页

    “c#一个定时重启的小程序实现代码”是一个面向Windows操作系统开发的应用程序,用于定时重启计算机。具体的实现思路如下: 获取重启时间 首先需要获取用户设定的重启时间,可通过以下代码实现: DateTime restartTime = new DateTime(year, month, day, hour, minute, second); 其中year…

    C# 2023年6月1日
    00
  • Ubuntu下VNC远程桌面的客户端和服务器端使用方法

    Ubuntu下VNC远程桌面的客户端和服务器端使用方法 客户端安装和配置 安装VNC Viewer客户端:在Ubuntu终端中输入以下命令进行安装: sudo apt-get update sudo apt-get install vncviewer 连接VNC服务器:在终端中输入VNC服务器的IP地址和端口号,例如: vncviewer 192.168.1…

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