首页 > 其他分享 >WPF 调用 ECAN 发送数据会阻塞的解决过程

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

时间:2023-05-02 16:35:04浏览次数:32  
标签:PCAN ECAN 发送 收发 线程 ms 发送数据 WPF

接了个活, 写个 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 的发送函数那

Top , 收发正常, 然后看在B ottom\ Top Bottom Top Bottom

标签:PCAN,ECAN,发送,收发,线程,ms,发送数据,WPF
From: https://www.cnblogs.com/707wk/p/17367846.html

相关文章

  • ## 用Wpf做一个可编程画板(续4-Diagram画板)
    先上一张效果动图。同样老规矩,先上源码地址:https://gitee.com/akwkevin/aistudio.-wpf.-diagram本次扩展的主要内容1.可编程模块,使用C#语言。2.控制台打印控件,可以打印程序中的Console.WriteLine数据3.为了便于大家使用,写了一个Box工厂分配Box的数据流向效果图。可编程模块......
  • 一个WPF开发的、界面简洁漂亮的音频播放器
    今天推荐一个界面简洁、美观的、支持国际化开源音频播放器。项目简介这是一个基于C#+WPF开发的,界面外观简洁大方,操作体验良好的音频播放器。支持各种音频格式,包括:MP4、WMA、OGG、FLAC、M4A、AAC、WAV、APE和OPUS;支持标记、实时显示歌词等功能;支持换肤、中英文等主流语言。......
  • 多通道振弦传感器无线采集仪发送数据到 FTP 服务器
    多通道振弦传感器无线采集仪发送数据到FTP服务器配置工具的参数配置区列出了与设备工作相关的所有参数项,每个参数项有【读取】和【修改】两个按钮,点击【读取】按钮获得设备的当前参数值,点击【设置】按钮将当前界面显示的值写入设备。注:参数修改后,必须点击【系统】面板内的【......
  • WPF中将Canvas导出为png图片
    1publicstaticvoidExportToPng(thisCanvascanvas,Uripath)2{3if(path==null)4{5return;6}7Transformtransform=canvas.LayoutTransform;8canvas.LayoutTransform=null;9Sizesize=newSize(900,600);10......
  • WPF程序接收启动参数并启动
    新建一个WPF项目WpfApp1 创建一个新的启动类publicclassNewApp{publicstaticstring[]Args=newstring[]{};[STAThread]publicstaticvoidMain(string[]args){Args=args;Appapp=newApp();......
  • 工程监测多通道振弦传感器无线采集仪 发送数据到邮箱
    河北稳控科技多通道振弦传感器无线采集仪发送数据到邮箱 每次设备启动后会将采集到的传感器数据进行内部存储,并在设置好的时间间隔将数据发送出去,通过修改“数据发送方式”参数,监测数据可由数据接口输出也可经由无线网络发送。在发送监测数据时,可通过修改“数据包协议”参数......
  • WPF教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介WPF(WindowsPresentationFoundation)是微软推出的基于Windows的用户界面框架,属于.NETFramework的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。WPF初入门教程-从简单的步骤了......
  • wpf中IValueConverter的两种实现方式(key和静态实例)以及 ValueConversion 特性
    使用值转换器的场景:你得到一个值,你需要根据你的需求转成另一个东西,可以是图片、对象等等都行传入的是object,传出的也是object,使用值转换器需要继承接口:IValueConverter里面有两个方法Convert和 ConvertBackConvert很好理解:你把xaml中某个对象中的某个属性或其他值传递到Value......
  • 河北稳控科技多通道振弦传感器无线采集仪 发送数据到手机
    河北稳控科技多通道振弦传感器无线采集仪发送数据到手机 每次振弦采集仪启动后会将采集到的传感器数据进行内部存储,并在设置好的时间间隔将数据发送出去,通过修改“数据发送方式”参数,监测数据可由数据接口输出也可经由无线网络发送。在发送监测数据时,可通过修改“数据包协议......
  • 【WPF学习】05 数据绑定
    如何实现WPF窗口内元素控件之间的数据绑定传统方式——先在XAML界面为对应控件设置建立相互关联所需要的属性,再在窗口后台编写业务代码这里以一个滑动条slider和三个文本框textbox之间的数据绑定为例:按照传统方式: 后台业务代码: 但在WPF里我们无需编写这种数据转换和传值......