久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

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


作者: Highnose    時間: 2023-1-19 13:02
端口號在系統里可以改
作者: lkc8210    時間: 2023-1-19 13:32
開啟命令提示視窗(win鍵+R>CMD)
執行指令:set devmgr_show_nonpresent_devices=1
同視窗繼續執行指令:devmgmt.msc
你應該會看到裝置管理員
選擇 "檢視"->"顯示隱藏裝置"
把右方 "+" 點開看看,你應該可以看到平時看不見的設備
呈現淡灰色的就是離線設備,原則上可以刪掉
作者: 51hei**1140    時間: 2023-1-19 20:32
系統的串口號升到了COM17,并不是有17串口在使用吧,
你可以進到設備管理器里面,把你現在用的串口號改小
作者: 風158    時間: 2023-1-19 21:12
這個應該經常初始化,否則再多串口號也不夠用。
作者: angmall    時間: 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


作者: devcang    時間: 2023-1-19 23:12
通常這樣寫  \\.\COM23  。 不然,去設備管理器中修改到較小的串口號
作者: cdhigh    時間: 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”

如果你的程序需要在其他機器上運行,則需要將這個文件拷貝過去,或制作一個安裝程序,里面包含這個文件。

作者: 名字不是重點    時間: 2023-1-20 14:15
回以上各樓層:
修改串口號我明白,有問題的電腦的所有COM16之前的串口都顯示在使用,所以也改不了低于16的,通過注冊表可以把多出來的串口號刪除,但不期望使用上位機軟件的人會正確操作。
所以,一勞永逸的方法是更新上位機軟件,跳過這個坑。。
不用控件用API倒是可以試一下。或許可以避開這個BUG
作者: Hephaestus    時間: 2023-1-23 15:21
就是個重啟一下電腦的問題,沒必要搞這么復雜。
作者: 名字不是重點    時間: 2023-1-24 09:25
Hephaestus 發表于 2023-1-23 15:21
就是個重啟一下電腦的問題,沒必要搞這么復雜。


你是說重啟之后串口號就能小于16,或是上位機就能支持大于16的串口號?
還是說重啟之后串口號顯示顯示“使用中”的狀態會被改變?








歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产欧美一区二区三区久久 | 国产精品 欧美精品 | 99re热精品视频 | 精品国产乱码久久久久久丨区2区 | 国产情侣啪啪 | 欧美精品福利 | 欧美在线视频一区 | 日本一区二区三区在线观看 | 国产第二页| 在线黄av| 欧美日韩精品一区 | 91久久久精品国产一区二区蜜臀 | 91在线看片 | 欧美全黄 | 欧美大片久久久 | 三级黄视频在线观看 | 日韩午夜| 国产精品久久亚洲7777 | 黄色网址在线免费观看 | 欧美一区2区三区4区公司二百 | 久久综合香蕉 | 免费一级黄 | 在线观看中文字幕 | 人人亚洲| 免费观看成人av | 成人在线播放网站 | 国产精品成人一区二区三区夜夜夜 | 久久久久久久一区二区三区 | 久久精品亚洲一区 | 欧美 日韩 在线播放 | 欧美天堂在线 | 精品国产青草久久久久96 | 91国自视频 | 成年人国产在线观看 | 日韩精品免费在线观看 | 天天综合网7799精品 | av一级久久 | 欧美一级在线免费观看 | 亚洲一区二区三区在线 | 亚洲日本中文 | 欧美精品国产一区二区 |