【问题标题】:Problems opening and closing the mscomm port in vb6 when interfacing microcontroller连接微控制器时在 vb6 中打开和关闭 mscomm 端口的问题
【发布时间】:2013-02-27 05:59:57
【问题描述】:

代码是使用串行端口从微控制器或串行设备中的任何设备获取数据,所以我在端口打开和获取数据时遇到问题,最近 20 天都遇到这个问题,请尽早帮助我: )

Private Sub Command1_Click()
    MsgBox ("The port is open " & MSComm1.PortOpen)

    If (MSComm1.PortOpen = False) Then
    MSComm1.PortOpen = True
    End If
    Command1.Enabled = False
    Command2.Enabled = True
End Sub

Private Sub Command2_Click()
    If (MSComm1.PortOpen = True) Then
    MSComm1.PortOpen = False
    End If
    Command1.Enabled = True
    Command2.Enabled = False
End Sub

Private Sub Form_Load()
    With MSComm1
    .CommPort = 1
    .RThreshold = 1
    .RTSEnable = True
    .Settings = "9600,N,8,1"
    .InputLen = 127
    .SThreshold = 1
    End With
End Sub

Private Sub Form_Unload(Cancel As Integer)
    If (MSComm1.PortOpen = True) Then
    MSComm1.PortOpen = False
    End If
End Sub

Private Sub MSComm1_OnComm()
    Dim Buffer As String

    Select Case MSComm1.CommEvent
    Case comEvReceive
    'Text1.Text = " "
    Buffer = MSComm1.Input
    Text1.Text = Text1.Text & Buffer
    End Select
End Sub!

下面是包含MScomm控件、一个文本框、两个用于连接和断开连接的命令按钮的界面图像:

【问题讨论】:

  • 您遇到什么错误?你能用 inputlen=0 试试吗?您是否收到任何数据? (在 text1.text=... 的行上放一个断点并观察缓冲区变量的内容
  • 我没有得到任何数据-"INVALID PORT number",RUNTIME ERROR 8002 我连接到端口 1 本身,在设备管理器中检查了它
  • 我使用 MAX 232 代替 RS 232 连接外围接口微控制器和计算机
  • 我将 RS 232 连接到 USB 端口,com 端口和 USB 端口不一样吗?

标签: vb6 port microcontroller serial-communication mscomm32


【解决方案1】:
    '****** paste this in form'*********    
    Option Explicit

        Dim Portnumber As Integer


        Private Sub cmdClose_Click()

            On Error GoTo handler

            MSComm1.PortOpen = False
            Shape1.FillColor = vbRed
            cmdOpen.Enabled = True
            txtRecieve.Text = ""
            Exit Sub

        handler:                                MsgBox Err.Description
        End Sub

        Private Sub cmdOpen_Click()

            On Error GoTo handler

         '   Debug.Print cboComm.ItemData(cboComm.ListIndex)

            portnumber = Mid(cboComm.Text, 4, (Len(cboComm.Text) - 3))

            a = Mid(cboComm.Text, 4, (Len(cboComm.Text) - 3))
        '    If MSComm1.PortOpen = False Then
                MSComm1.CommPort = portnumber
                MSComm1.PortOpen = True
                Shape1.FillColor = vbGreen
                cmdOpen.Enabled = False
        '    End If

            Exit Sub

        handler:                   MsgBox Err.Description
        End Sub

        Private Sub Form_Load()
            cboComm.Clear   '*** cbo is for combobox
            MSComm1.Settings = "9600,n,8,1"
            ListComPorts
        End Sub

        Private Sub ListComPorts()

            Dim i As Integer

            cboComm.Clear

            Static iData As Integer
            iData = -1

            For i = 1 To 16
                If ComAvailable(i) Then
                    cboComm.AddItem (("COM") & i)
                    iData = iData + 1
                    cboComm.ItemData(iData) = i
                End If

            Next

            cboComm.ListIndex = 0
            '    cmdGet.Enabled = False
        End Sub

        Private Sub MSComm1_OnComm()

            Select Case MSComm1.CommEvent

                Case comEvReceive
                    txtRecieve.Text = MSComm1.Input

                Case Else
                    Debug.Print "Event: " & MSComm1.CommEvent
            End Select

        End Sub
        '**************** End of form code **************

       '*********** Now API code******************

        '********** Paste in Module**************

        Option Explicit

        '*** API Declarations
        Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

        Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

        '*** API Structures
        Public Type SECURITY_ATTRIBUTES

            nLength As Long
            lpSecurityDescriptor As Long
            bInheritHandle As Long

        End Type

        '***API Constants
        Public Const FILE_SHARE_READ = &H1

        Public Const FILE_SHARE_WRITE = &H2

        Public Const OPEN_EXISTING = 3

        Public Const FILE_ATTRIBUTE_NORMAL = &H80

        '*** Create a Fuction to check whether COM exists or not. If exists return "true" otherwise "false"
        Public Function ComAvailable(comnum As Integer) As Boolean

            Dim hcom As Long

            Dim ret  As Long

            Dim sec  As SECURITY_ATTRIBUTES

            hcom = CreateFile("\.\COM" & comnum & "", 0, FILE_SHARE_READ + FILE_SHARE_WRITE, sec, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)

            If hcom = -1 Then
                ComAvailable = False
            Else
                ComAvailable = True

                '*** close the CO MPort
                ret = CloseHandle(hcom)
            End If

        End Function

        ''''''''*******End of module code********

I think  this will help you.....

【讨论】:

    【解决方案2】:

    如果您收到错误 8002,则该端口可能不存在。

    您是使用 rs232 连接,还是通过 USB 端口连接?

    看看我发布的代码here ....当你运行它时,它会给出你系统上可用端口的列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 2021-07-03
      • 2014-02-09
      • 1970-01-01
      相关资源
      最近更新 更多