API的使用是基于驱动的吗?即使没有连接设备,CH341OpenDevice也能得到一个long型的返回值而不是-1,这正常吗?即使同样设备序号为0,函数也能重复的执行来得到不重复的句柄返回值,这样也是正常现象吗? 是我应该在程序逻辑上加以判断还是调用上哪里出了问题呢?
CH341OpenDevice如果在没有设备的时候,应该是返回INVALID_HANDLE_VALUE这个值的。 重复打开是会返回不同的句柄值的,如果要独占使用,调用函数CH341SetExclusive来设置。
谢谢 另外问下,api中的long是32位的还是64位的?
在Windows系统下,long型变量长度一般都是32位四字节。
Public Declare Function CH341OpenDevice Lib "CH341DLL.DLL" (ByVal iIndex As System.Int32) As System.Int32 ' 打开CH341设备,返回句柄,出错则无效 ' iIndex 指定CH341设备序号,0对应第一个设备
Try Dim zero As System.Int32 = 0 address = CH341OpenDevice(zero) MsgBox(address) Catch ex As Exception MsgBox("failed") End Try
还是搞不明白哪里有问题,结果总是显示-1.....
顺带一提,CH341GetVersion的结果是33,这个不知道有没有问题
不知道还有木有示例程序代码的下载了,网站更新之后,有些老帖里的资源地址都下载不了了
-1的话就是无效句柄值,如果没有341设备在电脑上,那这个是正常的值。CH341GetVersion返回33应该是不对的,你是否装的串口还是并口的驱动,在设备管理器里面是否有一个外部接口的设备?你可以下载我们CH341EVT的资料包,里面有所有的评估程序和代码http://www.wch.cn/downloads.php?name=pro&proid=60
我已经连上设备了,显示有usb设备连入,虚拟的串口也可以用的 只不过dll文件是我另外找的,不是驱动里的,驱动带的dll是个特别小的CH341PT.DLL,只有6.55k,里面好像没有直接读写的api,只有判断串口是否来自341芯片以及事件通知。我这边的软件在usb断开时串口会消失引发错误,所以希望可以用api直接读写,就在网上找了一个ch341dll.dll,里面标注了几个可以给串口用的api,其中CH341OpenDevice这种应该是可以用的 不过这个好像就是evt资料包里并口的那个CH341DLL.BAS编译的dll,我看dll提供的函数和bas文件里写的是一样的。是不是要改装别的版本驱动才行?
现在正在用的驱动信息: ; CH341SER.INF ; Driver for CH341 (USB=>SERIAL chip) V3.3 ; WDM&VXD for Windows 98/Me/2000/XP/Server2003/Vista/64bit Vista/Server2008/Win7/64bit Win7 ; Copyright (C) W.ch 2001-2011 ;
[Version] Signature = "$Chicago$" Class = ;Ports ClassGuid = {4D36E978-E325-11CE-BFC1-08002BE10318} Provider = %WinChipHead% DriverVer = 11/04/2011, 3.3.2011.11 CatalogFile.NT = CH341SER.CAT
CH341DLL.dll是操作并口模式CH341的库文件,操作不了转异步串口模式的341的。 你现在还是在插拔通知里面把串口操作处理一下,把报错的问题解决。
我试试吧。拔下来之后timer读不到数据,我的程序都按常理关串口dispose了,但是代码段以外的部分会报错,不知道是哪的问题,我去试试根据通知来处理串口,看看更迅速的应对能不能回避问题╮(╯▽╰)╭
Declare Function CH341PtSetDevNotify Lib "CH341PT.DLL" (ByVal iDeviceID As String, ByVal iNotifyRoutine As long) As Boolean ' 指定端口设备事件回调程序,为NULL则取消事件通知,否则在检测到事件时调用该程序 ' CH341PtSetDevNotify 设定端口设备事件通知程序 ' iDeviceID, 可选参数,指向以\0终止的字符串,指定被监控的设备的ID或者不含序号的主名称,对于串口该参数必须为NULL或者"COM" ' iNotifyRoutine 指定端口设备事件回调程序,为NULL则取消事件通知,否则在检测到事件时调用该程序
这个iNotifyRoutine是个啥啊,写个函数然后怎么指定?这个long类型是句柄还是啥...
iNotifyRoutine是一个函数的地址,当有设备插拔时,就会根据这个函数的入口地址来调用这个函数。
雅蠛蝶,vb.net的垃圾回收机制在回收因为拔出事件废弃的串口时总是出错,明明已经重新打开并且废弃缓冲区后再关闭dispose重新初始化了,我已经实在无语了,求个用api操作串口模式下芯片的方法,有什么适用串口模式芯片还能直接用api读写数据的dll么..... vb.net下addressof只能返回给delegate不能返回int32型地址,也有点蛋疼....
看来可能是vb.net的串口控件太敏感,mscomm控件则迟钝的恰到好处,换用mscomm吧,感谢耐心解答