문제

VBA의 직렬 포트에 액세스하는 가장 좋은 방법은 무엇입니까?

PowerPoint의 조치 버튼에서 직렬 포트를 통해 간단한 문자열을 보낼 수 있어야 할 영업 담당자 중 일부가 필요합니다. 나는 일반적으로 VBA를 사용하지 않습니다. 일반적으로 나는 그것을 일종의 적용으로 바꾸 겠지만, 실제로 아이디어가 그렇게 나쁘다고 생각하지 않습니다. 프로젝터에있는 동안이 장치를 데모하고 다른 영업 사원 및 비 기술인과 대화하는 것은 편리한 도구가 될 것입니다. 또한이 영업 담당자는 VBA 또는 PowerPoint 프레젠테이션을 작은 수정하는 데 아무런 문제가 없지만 .NET 응용 프로그램을 다시 컴파일하는 것과는 다릅니다.

나는 우리가 행동에 대한 프레젠테이션에서 실행되는 배치 파일을 통해 그것을 할 수 있다는 것을 알고 있지만, 그렇게 행복하지는 않습니다. 나는 우리가 아마도 com 객체에 액세스하고 거기에서 달릴 수 있다고 생각하지만, 다시 VBA에서 사용할 최신의 가장 큰 라이브러리에서는 실제로는 아니며 쉽게 열리는 방법에 대한 빠른 작은 입문서를 얻는 것이 좋을 것입니다. 연결을 보내고 닫습니다.

이것은 여러 사람의 컴퓨터에서 실행해야하므로 다른 기계로 쉽게 운송 할 수있는 경우 좋을 것입니다. Office 2007 및 Windows XP에서 실행해야한다고 말할 수 있어야합니다. 다른 어떤 것과의 호환성은 좋은 보너스가 될 것입니다.

이것을 어떻게 처리해야합니까? 좋은 팁이나 요령이 있습니까? 도서관 추천?

도움이 되었습니까?

해결책

Win32 API는 직렬 포트를 파일로 처리합니다. VBA 내에서 이러한 API 기능을 호출하여 직렬 포트에 직접 액세스 할 수 있습니다. 이전 .NET 응용 프로그램을 위해이 작업을 수행해야했지만 VBA는 다르지 않습니다.

이 사이트에서 해시를 해보지 않고 몇 년 동안 내가 매달린 참조가 있습니다. VBA에서 직렬 포트 통신을 수행하는 방법

다른 팁

Sub Stinky()
Dim COM_Byte As Byte
Dim Received_Lines As Long
Dim Input_Buffer As String
Dim Output_Buffer As String
Dim Chars2Send As Long
Dim CharsRemaining As Long
Dim lfsr As Long
    Open "COM7:9600,N,8,1" For Random As #1 Len = 1
    Input_Buffer = ""
    CharsRemaining = 0
    Do
    Get #1, , COM_Byte
    If COM_Byte Then
        If COM_Byte = 13 Then           ' look for CR line termination
            Debug.Print Input_Buffer, Now   ' print it
            Input_Buffer = ""               ' and clear input buffer
        '   generate some output (9 characters)
            lfsr = &H3FFFFFFF - 2 ^ (Received_Lines And 15)
            Output_Buffer = "?@@@@@@@@"
            Chars2Send = 9
            CharsRemaining = 9
            For j = 0 To 2
                Mid(Output_Buffer, 2 + j, 1) = Chr(Asc(Mid(Output_Buffer, 2 + j, 1)) + (31 And Int(lfsr / 32 ^ (2 - j))))
            Next j
            Debug.Print Output_Buffer
        '   show what I generated
            Received_Lines = Received_Lines + 1 ' keep track of received line count
        Else
            Input_Buffer = Input_Buffer & Chr(COM_Byte) ' assemble output buffer
        '   process any characters to send
            If CharsRemaining Then
                CharsRemaining = CharsRemaining - 1
                COM_Byte = Asc(Mid(Output_Buffer, Chars2Send - CharsRemaining, 1))
                Put #1, , COM_Byte
            End If
        End If
    End If
    DoEvents
    Loop
    Close
End Sub

이것은 나를 위해 작동합니다. 처음 Teraterm을 사용했기 때문에 Open이 실제로 Baud 요금을 설정하는지 확실하지 않습니다. 내 COM 포트는 BASYS3 프로토 타이핑 키트에 대한 USB 연결입니다. 그것은 9600에서 캐릭터를 뿜어 내고 CR로 끝나는 36 자의 기록입니다. 9 자의 명령을 무작위로 보낼 수 있습니다. 위의 코드에서는 새 라인을받을 때 마다이 명령 문자열을 생성합니다. 내가 어떤 캐릭터를 보내야하는지 선택한 방식은 약간 어리석은 일입니다. 아마도 더 좋은 방법은 캐릭터 포인터와 여러 캐릭터를 갖는 것입니다.

다음은 PC 직렬 포트에서 메시지를 보내고받을 수있는 VBA 코드의 간단한 모듈입니다. 이것은 그다지 우아하지는 않지만 간단하고 현대적인 버전의 Excel과 Windows에서 작동해야합니다.

기능을 확장하고 메시지를 저장하거나 구문 분석 할 수 있도록 혼자 남아 있습니다. 이것은 직렬 포트를 다루기위한 낮은 수준의 것들을 보여줍니다.

처음 5 줄은 밀리 초 "수면"라이브러리 기능 (Excel 버전 기반)을 선언합니다.

Serialport () 서브 루틴은 포트를 열고, 일부 데이터를 전송하고, 일부 데이터를 수신하고, 일부 데이터를 다시 수신하려고 시도하고 (실제로 "파일의 끝"오류로 인해 실행되지 않음을 보여주고) 포트.


#If VBA7 Then ' Excel 2010 or later
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal Milliseconds As LongPtr)
#Else ' Excel 2007 or earlier
    Public Declare Sub Sleep Lib "kernel32" (ByVal Milliseconds As Long)
#End If

Public Sub SerialPort()
    ' open a COM port, transmit a message, gather results, close the port.

    ' open the COM port as file #1
    Debug.Print "Open COM port 4"
    Open "COM4:115200,N,8,1" For Binary Access Read Write As #1

    transmit$ = Chr(2) + "Hello, World." + Chr(13)
    receiveDummy$ = "~~~"

    ' transmit a message
    Put #1, , transmit$
    Debug.Print "Message sent."

    ' wait a bit for a response
    Sleep 100

    ' check for received message
    Debug.Print "Look for incoming message."
    On Error Resume Next
    Do While True
        receive$ = receiveDummy$  'dummy value
        Input #1, receive$
        If receive$ = receiveDummy$ Then Exit Do  'the string didn't change, so move on
        Debug.Print receive$
    Loop
    On Error GoTo 0

    ' do it again to show that the empty input queue doesn't stop the flow
    Debug.Print "Look again for incoming message (should not stop on error)."
    On Error Resume Next
    Do While True
        receive$ = receiveDummy$  'dummy value
        Input #1, receive$
        If receive$ = receiveDummy$ Then Exit Do  'the string didn't change, so move on
        Debug.Print receive$
    Loop
    On Error GoTo 0

    ' close the serial port
    Debug.Print "Close COM port."
    Close #1

    Debug.Print "Done."
End Sub
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top