Serial 통신(RS-232) 2 김성환 기계설계 자동화 공학부 비주얼베이직의 기초사항을 공부합니다.
목 표 목표 : PC의 주요통신 방식 중 직렬통신에 대하여 살펴보고 VB에서 프로그래밍하는 방법을 학습한다. 주요내용 1. 프로토콜 2. BCC 3. Query & Acknowledge 4. 프로토콜 예제.
Protocol Protocol은 통신의 약속으로서 통신의 신뢰성을 높이고 수신된 데이터에서 유익한 정보를 용이하게 추출할 수 있도록 한다. 송신과 수신단에 프로토콜에 대한 인코딩(encoding)과 디코딩(decoding or Parsing) 부를 가지고 있다. 중요한 것은 통신은 항상 100% 완벽하지 않다는 것을 가정해야 한다는 것이다. 따라서, 통신설계자는 데이터의 신뢰성과 전송속도 등을 고려하여 설계한다. 송신 수신 Happy Happy @ 5 Happy 3D % Encoder Decoder
Protocol 다음은 (x,y) 좌표를 전송하는 Protocol의 예이다. 무기, 공작 기계, 로봇 등에서는 이 데이터에 오류가 발생하면 상상할 수 없을 만큼 큰 피해를 가져올 수 있다. Start Byte, End Byte, BCC 등의 기능을 알아보자. 제어용 컴퓨터 @ + 7 2 1 - BCC Start Byte M X- Cord. Y- Cord. Block Check Code % End Byte Data Command
Block Check Code(BCC) 전송 데이터 블럭 단위 마지막에 몇 바이트 짜리 BCC를 붙여 통신의 신뢰성을 높인다. 가장 완벽한 것은 같은 데이터를 여러 번 보내서 그 중에서 하나라도 차이점이 있으면 다시 보내는 것이다. 하지만 중복으로 데이터를 보내는 것은 통신량이 증가되므로 BCC를 많이 사용한다. 다음은 주로 많이 사용하는 BCC를 열거하였다. Exclusive OR : 모든 데이터를 bitwise XOR Check Sum : 모든 데이터의 산술합 CRC (Cyclic Redundancy Check) LRC (Longitudinal Redundancy Check) Hamming Code : 에러복구 코드 Data BCC
Query & Acknowledge Query(질문)에 대한 Acknowledge(응답)을 확인함으로써 통신에 대한 신뢰를 높인다. M “Are you ready?” S “Yes!” “1234c678” “Not ok!” “Are you ready?” “Yes!” .
BCC (Exclusive Or) Exclusive Or Public Function bccXor(a As String) As Long ldata = Len(a) bccXor = Asc(Mid(a, 1, 1)) For k = 2 To ldata bccXor = bccXor Xor Asc(Mid(a, k, 1)) Next k End Function
BCC(CRC) CRC (Cyclic Redundancy Code) Public Function crcCompute(a As String) As Long Dim crcReg As Long crcReg = &HFFFF& ldata = Len(a) For k = 1 To ldata crcReg = crcReg Xor Asc(Mid(a, k, 1)) For i = 0 To 7 If (crcReg Mod 2) Then crcReg = (crcReg \ 2) Xor &HA001& Else crcReg = crcReg \ 2 End If Next i Next k crcCompute = crcReg End Function
통신 프로그래밍 예 구성요소에서 MS Comm Control 추가 Form Load Event에서 초기설정 다음 기능을 차례로 구현해 보자. (1) 단순 폴링 통신 (2) On_comm Event 사용. (3) List box에 대화내용 표시 (4) Enter Key 사용 (5) 머리말 구현
주요 설정 Control 의 이름을 MSC로 하자 COM1 포트를 사용함. MSC.CommPort = 1 Baud Rate 9600, No Parity, 8bit, 1 Stop bit MSC.Settings = “9600,n,8,1“ 입력 시 1문자씩 입력 MSC.InputLen = 1 한 개의 데이터가 들어와도 OnComm 이벤트 발생 MSC.RThreshold = 1 이제 포트를 연다. MSC.PortOpen = True
송신 On_ Comm Event 사용 Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then MSC.Output = Text2 & Text1 & Chr(13) List1.AddItem Text2 & Text1 Text1 = "" End If End Sub
수신 On_ Comm Event 사용 Private Sub MSC_OnComm() Dim a As String Static st As String If MSC.InBufferCount > 0 Then a = MSC.Input If a <> Chr(13) Then st = st & a Else List1.AddItem st st = "" End If
Protocol 설계 예제 - (1) 동기화 실험 두 컴퓨터의 데이터가 통신으로 동기화 되는 것을 실험한다. 한쪽에서 타이머로 타원의 궤적을 생성하여 송신하고 다른 쪽에서 이를 수신하여 Plot 한다. (2) 수동제어 실험 Shape Control을 이용하여 청색 공을 만들고 수동 커서 버튼으로 두 개의 공을 제어할 수 있도록 한다. 또한, 빨간 공을 만들고 이 공은 다른 컴퓨터에서 오는 데이터에 동기 시키자. x y @ + 7 2 1 - 7 2 1 BCC
화면 구성 채팅을 추가하려면? 화면의 크기를 (-1000,1000)-(1000,-1000) 으로 하자. SendData(x,y) 라는 서브루틴을 만들자. Xor, CRC등 여러 가지 BCC를 비교한다. Start Byte ‘@’의 역할은 ? 통신 중에 코드를 뽑아도 다시 동기화 된다. 채팅을 추가하려면?
송신부(Encoder) Public Sub SendData(X As Long, Y As Long) Dim t As String, temp As String, bcc As Integer t = "@" temp = Right("000" & CStr(Abs(X)), 3) If X >= 0 Then temp = "+" & temp Else temp = "-" & temp t = t & temp temp = Right("000" & CStr(Abs(Y)), 3) If Y >= 0 Then temp = "+" & temp Else temp = "-" & temp bcc = bccXor(t) t = t & Chr(bcc) List1.AddItem t If List1.ListCount > 20 Then List1.RemoveItem 0 End If MSC.Output = t End Sub
수신부(Decoder) Private Sub MSC_OnComm() Dim a As String, bcc As Integer Static R As String If MSC.InBufferCount > 0 Then a = MSC.Input If a = "@" Then f_started = True R = "@" Else If f_started Then R = R & a If Len(R) = 10 Then bcc = bccXor(Left(R, 9)) If bcc = Asc(Right(R, 1)) Then sh2.Left = Val(Mid(R, 2, 4)) sh2.Top = Val(Mid(R, 6, 4)) End If f_started = False End Sub