问题描述
目前的目标:在VB.net中使用第三方提供的dll和他们的硬件通过串口进行通讯现在第三方厂家提供了与他们硬件串口通讯的dll,他们提供的示例是在JScript写的如下所示:varreq:SYS_VERSION=newSYS_VERSION();ZEngine.Send("Device1",req);//将该请求发送给,“device1”的串口设备
在VB.net中添加提供的dll,来进行程序编写,声明好对象好,不清楚如何继续,代码如下所示:DimreadPanidReqAsNewZB_READ_CONFIGURATIONDimreadPanidInterfaceAsIREQUEST=CType(readPanidReq,IREQUEST)readPanidReq.ConfigId=&H1//MessageBox.Show(readPanidReq.ToString)
如何调用接口中的API,达到JScript中ZEngine.Send("Device1",req);的效果,即,如何将该请求数据发送给VB.net提供的串口(串口程序在网上有示例的代码)?下面是官方提供的说明文档截图:比较小白,基本处于无头绪状态,请大神们给指条明道,3q
解决方案
解决方案二:
这种情况,最优先的想法不应该是自己去调用。而是要求厂家给你个例子。电话沟通好过自己闷头干。非技术方式解决有时候成本比较低。
解决方案三:
引用1楼wuyazhe的回复:
这种情况,最优先的想法不应该是自己去调用。而是要求厂家给你个例子。电话沟通好过自己闷头干。非技术方式解决有时候成本比较低。
官方已经给出了JScript的demo(看到的应该有4-5个)并给处于JScript的环境,在他提供的JScript的环境中模仿着调用接口命令执行也正常;VB、C++等版本估计要开发者自己去完成,官方提供各版本Demo的可能性不大;另外,本人英文比较烂,跟人家沟通比较困难。现在要实现VB.net将命令发送串口设备执行,各类的变量有了,如何把请求通过串口send出去?望大神们指教
解决方案四:
另外在ZLL中可到一个和Send("Device1",req)比较近似的是否调用的方法的话,就类似这种?
解决方案五:
这个dll提供了哪些类,其中有send方法吗
解决方案六:
dll里面提供了串口的相关API
解决方案七:
下面代码是JScript的示例:ZEngine.add_OnMessageZPI2(this.MessageHandler);functionMessageHandler(zportName:String,id:MESSAGE_ID,msg:Object){}
在Dll中找到的相关类:
解决方案八:
处理消息类的handle:貌似自身水平,现在还不能把这些信息串起来有个demo的话可能会理解的快一些。
解决方案九:
ZEngine.Send("Device1",req);//将该请求发送给,“device1”的串口设备ZEngine是什么类型,在哪声明的
解决方案十:
谢谢回复ZEngine的描述如下图所示(在该厂家提供的编译环境里直接调用了):dll中看到一个send方法:请教个问题:论坛里怎么上传附件(把dll文件上传上来)?
解决方案十一:
6Lport中的方法,尝试着做如下操作:PublicClassForm1PublicOverridableSubInvoke(ByValsenderAsTI.ZPortLib.ZPort,ByValeAsTI.ZPortLib.MsgAvailEventArgs)EndSubPrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.LoadDimreadPanidReqAsNewZB_READ_CONFIGURATIONDimreadPanidInterfaceAsIREQUEST=CType(readPanidReq,IREQUEST)readPanidReq.ConfigId=&H1MessageBox.Show(readPanidReq.ToString)DimmsgAvailEventArgsAsMsgAvailEventArgs'PublicSubNew(ByValmsgAsObject,ByValmsgIDAsTI.ZPI2.MESSAGE_ID)TI.ZPortLib.MsgAvailEventArgs(的成员)'如下使用时提示错误:构造函数调用仅作为实例构造函数中的第一条语句有效。msgAvailEventArgs.New(readPanidReq,MESSAGE_ID.ZB_READ_CONFIGURATION)DimcurrentComAsZPort'如下使用时提示错误:该类中Name为只读属性currentCom.Name="COM6"Invoke(currentCom,msgAvailEventArgs)EndSubEndClass
出现的问题如何消除,或者说怎么使用才正确?3q
解决方案十二:
看来你VB的基础也不太好?DimcurrentComAsZPortmsgAvailEventArgs=NewMsgAvailEventArgs(readPanidReq,MESSAGE_ID.ZB_READ_CONFIGURATION)只是定义了变量,但从未赋值你就敢currentCom.Name="COM6"直接空引用异常,Name是只读属性,不能直接赋值currentCom.Invoke(currentCom,msgAvailEventArgs)你看看如何取得当前串口ZPort对象的实例currentCom
解决方案十三:
引用11楼dongxinxi的回复:
看来你VB的基础也不太好?DimcurrentComAsZPortmsgAvailEventArgs=NewMsgAvailEventArgs(readPanidReq,MESSAGE_ID.ZB_READ_CONFIGURATION)只是定义了变量,但从未赋值你就敢currentCom.Name="COM6"直接空引用异常,Name是只读属性,不能直接赋值currentCom.Invoke(currentCom,msgAvailEventArgs)你看看如何取得当前串口ZPort对象的实例currentCom
按照你说的那样使用就木错误提示了,非常感谢!;工作中主要用C,对VB的了解程度也只是做做串口配置小工具的程度,跟零基础差别不大;另外,如你所说ZPortLib中有扫描串口的方法portControl.StartAutoScan()
解决方案十四:
使用ZPortLib进行串口扫描后,获取不到ZPort对象dll中的成员方法,如下图所示:尝试的代码:PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.LoadDimreadPanidReqAsNewZB_READ_CONFIGURATIONDimreadPanidInterfaceAsIREQUEST=CType(readPanidReq,IREQUEST)readPanidReq.ConfigId=&H1DimmsgAvailEventArgsAsMsgAvailEventArgs'PublicSubNew(ByValmsgAsObject,ByValmsgIDAsTI.ZPI2.MESSAGE_ID)TI.ZPortLib.MsgAvailEventArgs(的成员)msgAvailEventArgs=NewMsgAvailEventArgs(readPanidReq,MESSAGE_ID.ZB_READ_CONFIGURATION)DimportCfg(1)AsPortSettingsportCfg(0)=NewPortSettings("COM29",True,PortSettings.DataBitsValue.DATABITS_8,PortSettings.ParityValue.PARITY_NONE,115200,1,False,False)DimportManagerAsNewController'**********************************************************************'第一步:扫描串口,获得一个COMPortList结果'官方描述:PublicSubStartAutoScan()TI.ZPortLib.Controller(的成员)'**********************************************************************portManager.StartAutoScan()'portManager.ManualScan(portCfg)'能够显示出扫描到的串口Fori=0To5MessageBox.Show(portManager.COMPortList(i))'能够打印出PC上当前COM口,如“COM1”'MessageBox.Show(portManager.ZPortList(0).Name)'没有打印ZPortList中的任何信息!!?????Next'**********************************************************************'第二步:从COMPortList选定其中一个有效的ZPort并对其配置'**********************************************************************'**********************************************************************'第三步:'将req(请求)发送给指定串口'**********************************************************************'这里开始有疑问:'目前在dll里找到两个看起来和发送相关的方法:'1.9L图片ZScript.dll中的send()'2.ZPortLib.dll中的PublicOverridableSubInvoke(ByValsenderAsTI.ZPortLib.ZPort,ByValeAsTI.ZPortLib.MsgAvailEventArgs)'这里是要求我程序实现Invoke(TI.ZPortLib.ZPort,TI.ZPortLib.MsgAvailEventArgs)??????'DimcurrentComAsNewZPort'Invoke(currentCom,msgAvailEventArgs)EndSub
是我语法上的问题?还是其他?请大神们指正,3Q