본문 바로가기
programming language/VBA

Windows 에서 Lin 통신 할때 Visual Basic 시리얼 포트 핸들 얻는 방법

by __observer__ 2020. 4. 15.
반응형

요즘 Windows Visual Basic 을 사용하여 닷넷 환경에서 LIN(Local Interconnect Network) 통신용 프로그램을 만들고 있습니다. Lin 통신을 하기 위해서는 아래 스펙에서 확인 할 수 있는 바와 같이, 일반적인 UART 통신과는 약간 다르게 13 nominal bit times 동안 break field 를 설정해 주는 부분이 있는데

https://www.cs-group.de/wp-content/uploads/2016/11/LIN_Specification_Package_2.2A.pdf

break field 를 구현하기 위해 kernel32 에 있는 함수인 SetCommBreak, ClearCommBreak 와 같은 함수를 사용하곤 합니다.

그런데 SetCommBreak, ClearCommBreak 함수를 확인해 보면 통신 장비 핸들을 argument 로 넣게 되어 있습니다.

https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setcommbreak

저도 이번에 Visual Basic 닷넷을 처음 사용해 보는데~Timer, SerialPort 를 비롯해 굉장히 다양한 컨트롤 들이 기본으로 제공되어 대단히 편리하다는 생각이 들었습니다. 그런데 Visual Basic 에서 기본으로 제공되던 SerialPort 를 사용하다 보니 위에서 얘기한 SetCommBreak, ClearCommBreak 에 들어가는 port 의 handle 을 얻는 방법을 잘 모르겠더군요.

그래서 검색을 열심히 해 봤고~ SafeFileHandle 이라는 걸 사용하면 된다는 것을 알 수 있었습니다.

그래서 아래와 같이 구성을 하게 되었고~

Imports Microsoft.Win32.SafeHandles
Function GetPortHandle(ByVal Port As SerialPort) As SafeFileHandle
Dim BaseStream As Object = Port.BaseStream
Dim BaseStreamType As Type = BaseStream.GetType
Return BaseStreamType.GetField("_handle", BindingFlags.NonPublic Or BindingFlags.Instance).GetValue(BaseStream)
End Function
Public hPortCmp As SafeFileHandle
Sub LinConnectorPortOpen(portnameV As String)
With Form1.SerialPort1
.DataBits = 8
.BaudRate = 19200
.PortName = portnameV
.StopBits = IO.Ports.StopBits.Two
.Parity = IO.Ports.Parity.None
.ReadTimeout = 20
.ReceivedBytesThreshold = 6
.Open()
End With
hPortCmp = GetPortHandle(Form1.SerialPort1)
End Sub

위 코드에서 얻은 hPortCmp 핸들을 사용하여 아래와 같이~ SetCommBreak, ClearCommBreak 함수에서 사용 할 수 있었습니다.

SetCommBreak(hPortCmp)



반응형

'programming language > VBA' 카테고리의 다른 글

MS 워드 VBA 그림 폭 맞추기  (14) 2012.08.01

댓글