找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1148|回复: 10
收起左侧

急求:VB6@win7(64bit)支持大于16的串口号的方法或控件

[复制链接]
ID:824490 发表于 2023-1-19 11:17 | 显示全部楼层 |阅读模式
VB6自带的串口控件最多只支持到Com16,但由于串口用的久了,各种USB-RS232的插拔,让串口号升到了COM17。VB6的串口程序在新的串口号前全部挂 了,查了好久才知道VB6原生的MSCOMM32控件不支持大于16的串口号,请各路大神支个招指点一下!

回复

使用道具 举报

ID:830831 发表于 2023-1-19 13:02 | 显示全部楼层
端口号在系统里可以改

评分

参与人数 1黑币 +5 收起 理由
名字不是重点 + 5

查看全部评分

回复

使用道具 举报

ID:161164 发表于 2023-1-19 13:32 | 显示全部楼层
开启命令提示视窗(win键+R>CMD)
执行指令:set devmgr_show_nonpresent_devices=1
同视窗继续执行指令:devmgmt.msc
你应该会看到装置管理员
选择 "检视"->"显示隐藏装置"
把右方 "+" 点开看看,你应该可以看到平时看不见的设备
呈现淡灰色的就是离线设备,原则上可以删掉

评分

参与人数 1黑币 +5 收起 理由
名字不是重点 + 5

查看全部评分

回复

使用道具 举报

ID:648281 发表于 2023-1-19 20:32 | 显示全部楼层
系统的串口号升到了COM17,并不是有17串口在使用吧,
你可以进到设备管理器里面,把你现在用的串口号改小

评分

参与人数 1黑币 +5 收起 理由
名字不是重点 + 5

查看全部评分

回复

使用道具 举报

ID:343102 发表于 2023-1-19 21:12 | 显示全部楼层
这个应该经常初始化,否则再多串口号也不够用。

评分

参与人数 1黑币 +5 收起 理由
名字不是重点 + 5

查看全部评分

回复

使用道具 举报

ID:155507 发表于 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

复制代码




vb6SerialAPI-master.zip

13.69 KB, 下载次数: 3

评分

参与人数 1黑币 +5 收起 理由
名字不是重点 + 5 赞一个!

查看全部评分

回复

使用道具 举报

ID:277550 发表于 2023-1-19 23:12 | 显示全部楼层
通常这样写  \\.\COM23  。 不然,去设备管理器中修改到较小的串口号

评分

参与人数 1黑币 +5 收起 理由
名字不是重点 + 5

查看全部评分

回复

使用道具 举报

ID:67925 发表于 2023-1-20 06:47 | 显示全部楼层
可以直接调用Windows API(CreateFile()...),本来控件只是API的一层封装而已,直接使用API也不会多复杂,不过既然你有这个提问,说明你不想用API。
还有一个简单的方法,修改串口控件OCX,将控件OCX判断串口号是否小于等于16的语句修改为小于等于255即可,这样就可以用到串口号1-255:


简明教程:
1. 找到mscomm32.ocx,如果是64位Windows7,则目录为:C:\Windows\SysWOW64\mscomm32.ocx
2. 使用HEX文本编辑器(比如UltraEdit之类的)打开
3. 查找HEX字符串“66 3D 10 00”
4. 将其修改为“66 3D FF 00”

如果你的程序需要在其他机器上运行,则需要将这个文件拷贝过去,或制作一个安装程序,里面包含这个文件。
回复

使用道具 举报

ID:824490 发表于 2023-1-20 14:15 | 显示全部楼层
回以上各楼层:
修改串口号我明白,有问题的电脑的所有COM16之前的串口都显示在使用,所以也改不了低于16的,通过注册表可以把多出来的串口号删除,但不期望使用上位机软件的人会正确操作。
所以,一劳永逸的方法是更新上位机软件,跳过这个坑。。
不用控件用API倒是可以试一下。或许可以避开这个BUG
回复

使用道具 举报

ID:883242 发表于 2023-1-23 15:21 | 显示全部楼层
就是个重启一下电脑的问题,没必要搞这么复杂。
回复

使用道具 举报

ID:824490 发表于 2023-1-24 09:25 | 显示全部楼层
Hephaestus 发表于 2023-1-23 15:21
就是个重启一下电脑的问题,没必要搞这么复杂。


你是说重启之后串口号就能小于16,或是上位机就能支持大于16的串口号?
还是说重启之后串口号显示显示“使用中”的状态会被改变?

无标题.jpg

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表