首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

如何自动检测可用串口号

2012-08-24 
怎么自动检测可用串口号?我在使用串口采集数据之前,想用程序直接能检测到我当前使用的串口号,这个怎么实现

怎么自动检测可用串口号?
我在使用串口采集数据之前,想用程序直接能检测到我当前使用的串口号,这个怎么实现啊?谢谢。

[解决办法]
“想用程序直接能检测到我当前使用的串口号”是什么意思?
[解决办法]
真郁闷,我真的没看懂~~
[解决办法]
逐个串口发送TEST指令,哪个串口收到了返回,说明哪个串口接了下位机。
前提是已经约定好了TEST指令。
[解决办法]
逐个试
[解决办法]
使用注册表列举 有效可用的端口号
'*********************************读取注册表串口值
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, ByVal lpData As String, lpcbData As Long) As Long
'Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Const HKEY_LOCAL_MACHINE = &H80000002
Const REG_SZ = 1
Dim i&, ComStr$(), S
Private Sub Command1_Click()
MsgBox GetAllPort
End Sub

Public Function GetAllPort() As String
On Error Resume Next
S = GetSerialPort(HKEY_LOCAL_MACHINE, "HARDWARE\DEVICEMAP\SERIALCOMM")
If ComStr(0) = "" Then Exit Function
GetAllPort = ""
For i = 0 To UBound(S)
GetAllPort = GetAllPort & S(i) & ","
Next i
End Function

Public Function GetSerialPort(RegAddr&, Items$) As String()
On Error Resume Next
Dim hKey&, S1$, S2$, L&, L1&, J&
RegOpenKey RegAddr, Items, hKey
ReDim Preserve ComStr$(0)
ComStr(0) = "": i = 0: J = 0: Rtn = 0
Do
L = 1000: L1 = 1000
S1 = Space(L): S2 = Space(L)
Rtn = RegEnumValue(hKey, i, S1, L, 0, REG_SZ, S2, L1)
If Rtn = 0 Then
If InStr(S1, Chr(0)) > 0 And InStr(S2, Chr(0)) > 0 Then
S1 = UCase(Left(S1, InStr(S1, Chr(0)) - 1))
S2 = UCase(Left(S2, InStr(S2, Chr(0)) - 1))
If InStr(S2, "COM") > 0 Then
ReDim Preserve ComStr$(J)
ComStr(J) = S2
J = J + 1
End If
End If
End If
i = i + 1
Loop Until Rtn <> 0
GetSerialPort = ComStr()
End Function


'***************** 使用上面的代码 将检测到的可用端口号 循环检测
Private Sub Command1_Click()
On Error GoTo Errh
MSComm1.CommPort = 1 'MSComm1.CommPort = i
With MSComm1 '宣告MsComm的结构体
.Settings = "9600,N,8,1" '设定通讯协议 9600波特率,无奇偶校验,8位数据,一个停止位
.InputLen = 0 '设置Input一次从接收缓冲读取
.InBufferSize = 1 '设置缓冲区接收数据为1字节
.RThreshold = 1 '设置接收一个字节就产生OnComm事件
.InputMode = comInputModeText
.InBufferCount = 0 '缓冲区清空
End With
If Not MSComm1.PortOpen Then MSComm1.PortOpen = True: MsgBox "串口使用成功并已打开!"
Errh:
If Err > 0 Then MsgBox "串口使用中!"
End Sub

[解决办法]
我正在使用的程序。
For a = 1 To 16
Comm.CommPort = a ’串口控件
Comm.PortOpen = True
If Comm.PortOpen = True Then
cboPort.AddItem Trim$(Str$(a)) '列表控件
Comm.PortOpen = False
End If
Next
[解决办法]
串口本身是没有回应的,打开或关闭都是这样.

好比一个电灯线路,你能打开或关闭开关,却不能只通过操作这个开关,而得知灯座上是否有装一个电灯,以及它是否是好的.



为了知道有没有电灯及好坏情况,需要从别的角度得到一些反馈信息,比如测试电流情况,或者看看有没有光产生.

所以需要知道串口上设备的情况,然后以设备约定的格式发送一个已知回应的指令过去,如果在一定时间内有回应,说明插了这个设备的,如果超时了,说明没接或损坏.
[解决办法]

探讨

引用:
我正在使用的程序。
For a = 1 To 16
Comm.CommPort = a ’串口控件
Comm.PortOpen = True
If Comm.PortOpen = True Then
cboPort.AddItem Trim$(Str$(a)) '列表控件
Comm.PortOpen = False
End If
……

[解决办法]
我也正需要,有高人明白吗?
[解决办法]
就那几个串口,设定后不会变的,编程时都设置好了,按号就座,有必要检测么

热点排行