標(biāo)題: 急求:VB6@win7(64bit)支持大于16的串口號(hào)的方法或控件 [打印本頁(yè)]

作者: 名字不是重點(diǎn)    時(shí)間: 2023-1-19 11:17
標(biāo)題: 急求:VB6@win7(64bit)支持大于16的串口號(hào)的方法或控件
VB6自帶的串口控件最多只支持到Com16,但由于串口用的久了,各種USB-RS232的插拔,讓串口號(hào)升到了COM17。VB6的串口程序在新的串口號(hào)前全部掛 了,查了好久才知道VB6原生的MSCOMM32控件不支持大于16的串口號(hào),請(qǐng)各路大神支個(gè)招指點(diǎn)一下!


作者: Highnose    時(shí)間: 2023-1-19 13:02
端口號(hào)在系統(tǒng)里可以改
作者: lkc8210    時(shí)間: 2023-1-19 13:32
開(kāi)啟命令提示視窗(win鍵+R>CMD)
執(zhí)行指令:set devmgr_show_nonpresent_devices=1
同視窗繼續(xù)執(zhí)行指令:devmgmt.msc
你應(yīng)該會(huì)看到裝置管理員
選擇 "檢視"->"顯示隱藏裝置"
把右方 "+" 點(diǎn)開(kāi)看看,你應(yīng)該可以看到平時(shí)看不見(jiàn)的設(shè)備
呈現(xiàn)淡灰色的就是離線設(shè)備,原則上可以刪掉
作者: 51hei**1140    時(shí)間: 2023-1-19 20:32
系統(tǒng)的串口號(hào)升到了COM17,并不是有17串口在使用吧,
你可以進(jìn)到設(shè)備管理器里面,把你現(xiàn)在用的串口號(hào)改小
作者: 風(fēng)158    時(shí)間: 2023-1-19 21:12
這個(gè)應(yīng)該經(jīng)常初始化,否則再多串口號(hào)也不夠用。
作者: angmall    時(shí)間: 2023-1-19 22:32
你可以用 VB6 Serial API class


  1. Option Explicit
  2. '// WIN32API Function
  3. '//Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

  4. Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

  5. Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long
  6. Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  7. Private Declare Function SetCommState Lib "kernel32" (ByVal hCommDev As Long, lpDCB As DCB) As Long
  8. Private Declare Function GetCommState Lib "kernel32" (ByVal nCid As Long, lpDCB As DCB) As Long

  9. '// WIN32API Structure
  10. Private Type DCB
  11.         DCBlength As Long
  12.         BaudRate As Long
  13.         fBitFields As Long 'See Comments in Win32API.Txt
  14.         wReserved As Integer
  15.         XonLim As Integer
  16.         XoffLim As Integer
  17.         ByteSize As Byte
  18.         Parity As Byte
  19.         StopBits As Byte
  20.         XonChar As Byte
  21.         XoffChar As Byte
  22.         ErrorChar As Byte
  23.         EofChar As Byte
  24.         EvtChar As Byte
  25.         wReserved1 As Integer 'Reserved; Do Not Use
  26. End Type

  27. '// WIN32API Constant
  28. Private Const GENERIC_READ = &H80000000
  29. Private Const GENERIC_WRITE = &H40000000
  30. Private Const OPEN_EXISTING = 3
  31. Private Const FILE_FLAG_OVERLAPPED = &H40000000
  32. Private Const INVALID_HANDLE_VALUE = -1
  33. Private Const NOPARITY = 0
  34. Private Const ONESTOPBIT = 0

  35. Private Const FILE_FLAG_NO_BUFFERING = &H20000000

  36. '// Comm Port Handle
  37. Private hComm As Long

  38. Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  39.     '// Close the opened Comm
  40.     If hComm <> 0 Then CloseHandle (hComm)
  41. End Sub

  42. Private Sub CmdAction_Click(Index As Integer)
  43.     Dim Idx As Integer
  44.     Select Case Index
  45.     Case 0 '// Open/Close
  46.         If CmdAction(0).Caption = "&Open" Then
  47.             If OpenPort(txtCOMM(0).Text, CLng(txtCOMM(1).Text), CLng(txtCOMM(2).Text)) <> 0 Then
  48.                 CmdAction(0).Caption = "&Cancel"
  49.                 For Idx = 0 To 2: txtCOMM(Idx).Enabled = False: Next
  50.                 txtData.Enabled = True
  51.                 CmdAction(1).Enabled = True
  52.                 lblStatus.Caption = "Open Port Successful: Hanlde -> " & hComm
  53.             Else
  54.                 lblStatus.Caption = "Fail to open port!!!"
  55.             End If
  56.         Else
  57.             CloseHandle (hComm)
  58.             CmdAction(0).Caption = "&Open"
  59.             For Idx = 0 To 2: txtCOMM(Idx).Enabled = True: Next
  60.             txtData.Enabled = False
  61.             CmdAction(1).Enabled = False
  62.             lblStatus.Caption = "Port Closed"
  63.         End If
  64.     Case 1 '// Send
  65.         Write2Port txtData.Text
  66.     End Select

  67. End Sub

  68. Private Function OpenPort(ByVal strPort As String, ByVal lngBaudRate As String, ByVal lngDataBit As Long) As Long
  69.     Dim pDCB As DCB
  70.     Dim lpPort As String
  71.    
  72.     '// Create Comm Name Buffer
  73.     '//lpPort = String(6, Chr(0))
  74.     '//Mid$(lpPort, 1, 6) = "COM" & strPort & ":"
  75.        
  76.     lpPort = "\\.\COM" + strPort + vbNullChar
  77.        
  78.     '// Close the current opened Comm Port (If any)
  79.     If hComm > 0 Then CloseHandle (hComm)
  80.    
  81.     '// Open selected comm port
  82.     '//hComm = CreateFile(lpPort, _
  83.     '//                    GENERIC_READ Or GENERIC_WRITE, _
  84.     '//                    0, _
  85.     '//                    vbNull, _
  86.     '//                    OPEN_EXISTING, _
  87.     '//                    0, _
  88.     '//                    vbNull)

  89.         hComm = CreateFile(lpPort, _
  90.                                                 GENERIC_READ Or GENERIC_WRITE, _
  91.                                                 0, _
  92.                                                 ByVal 0, _
  93.                                                 OPEN_EXISTING, _
  94.                                                 FILE_FLAG_NO_BUFFERING, _
  95.                                                 0)

  96.    
  97.     If hComm <> INVALID_HANDLE_VALUE Then
  98.         pDCB.DCBlength = Len(pDCB)
  99.         
  100.         '// Retrieve default Comm port settings
  101.         GetCommState hComm, pDCB
  102.       
  103.         '// Configure new Comm port settings
  104.         With pDCB
  105.             .BaudRate = lngBaudRate
  106.             .Parity = NOPARITY
  107.             .ByteSize = lngDataBit
  108.             .StopBits = ONESTOPBIT
  109.             .EofChar = 0
  110.             .ErrorChar = 0
  111.             .EvtChar = 0
  112.             .fBitFields = 20625
  113.             .XoffChar = 19
  114.             .XoffLim = 512
  115.             .XonChar = 17
  116.             .XonLim = 2048
  117.         End With
  118.         
  119.         '// Set new configure Comm port settings
  120.         If SetCommState(hComm, pDCB) = 0 Then
  121.             CloseHandle (hComm)
  122.             OpenPort = 0

  123.             MsgBox "Fail to configure serial port!", vbExclamation + vbOKOnly, "Error"
  124.         Else
  125.             OpenPort = hComm
  126.         End If
  127.     Else
  128.         CloseHandle (hComm)
  129.         OpenPort = 0
  130.     End If
  131. End Function

  132. Private Sub Write2Port(ByVal strData As String)
  133.     Dim dwByteWrite As Long
  134.     Dim Sz As Long, Idx As Long
  135.     Dim Bytes() As Byte
  136.    
  137.     '// Create & Convert str into array of Byte
  138.     Sz = Len(strData)
  139.     ReDim Bytes(Sz) As Byte
  140.     For Idx = 1 To Sz
  141.         Bytes(Idx) = Asc(Mid$(strData, Idx, 1))
  142.     Next
  143.    
  144.     '// Write data into Open Comm Port
  145.     If hComm <> INVALID_HANDLE_VALUE Then
  146.         WriteFile hComm, _
  147.                     Bytes(1), _
  148.                     UBound(Bytes), _
  149.                     dwByteWrite, _
  150.                     ByVal 0&
  151.     Else
  152.         MsgBox "Invalid port handle", vbExclamation + vbOKOnly, "Error"
  153.     End If
  154.    
  155.     Erase Bytes
  156.    
  157. End Sub

復(fù)制代碼




vb6SerialAPI-master.zip

13.69 KB, 下載次數(shù): 3


作者: devcang    時(shí)間: 2023-1-19 23:12
通常這樣寫  \\.\COM23  。 不然,去設(shè)備管理器中修改到較小的串口號(hào)
作者: cdhigh    時(shí)間: 2023-1-20 06:47
可以直接調(diào)用Windows API(CreateFile()...),本來(lái)控件只是API的一層封裝而已,直接使用API也不會(huì)多復(fù)雜,不過(guò)既然你有這個(gè)提問(wèn),說(shuō)明你不想用API。
還有一個(gè)簡(jiǎn)單的方法,修改串口控件OCX,將控件OCX判斷串口號(hào)是否小于等于16的語(yǔ)句修改為小于等于255即可,這樣就可以用到串口號(hào)1-255:


簡(jiǎn)明教程:
1. 找到mscomm32.ocx,如果是64位Windows7,則目錄為:C:\Windows\SysWOW64\mscomm32.ocx
2. 使用HEX文本編輯器(比如UltraEdit之類的)打開(kāi)
3. 查找HEX字符串“66 3D 10 00”
4. 將其修改為“66 3D FF 00”

如果你的程序需要在其他機(jī)器上運(yùn)行,則需要將這個(gè)文件拷貝過(guò)去,或制作一個(gè)安裝程序,里面包含這個(gè)文件。

作者: 名字不是重點(diǎn)    時(shí)間: 2023-1-20 14:15
回以上各樓層:
修改串口號(hào)我明白,有問(wèn)題的電腦的所有COM16之前的串口都顯示在使用,所以也改不了低于16的,通過(guò)注冊(cè)表可以把多出來(lái)的串口號(hào)刪除,但不期望使用上位機(jī)軟件的人會(huì)正確操作。
所以,一勞永逸的方法是更新上位機(jī)軟件,跳過(guò)這個(gè)坑。。
不用控件用API倒是可以試一下;蛟S可以避開(kāi)這個(gè)BUG
作者: Hephaestus    時(shí)間: 2023-1-23 15:21
就是個(gè)重啟一下電腦的問(wèn)題,沒(méi)必要搞這么復(fù)雜。
作者: 名字不是重點(diǎn)    時(shí)間: 2023-1-24 09:25
Hephaestus 發(fā)表于 2023-1-23 15:21
就是個(gè)重啟一下電腦的問(wèn)題,沒(méi)必要搞這么復(fù)雜。


你是說(shuō)重啟之后串口號(hào)就能小于16,或是上位機(jī)就能支持大于16的串口號(hào)?
還是說(shuō)重啟之后串口號(hào)顯示顯示“使用中”的狀態(tài)會(huì)被改變?








歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1