close

Trust Me!! Trust You!!


  • Blog
  • Local Log
  • Tag Cloud
  • Key Log
  • Guestbook
  • RSS Feed
  • Write a Post
  • Admin

혹시 블로그 스킨이 깨져 보이시나요? 최신버전의 Internet Explorer(Windows용), Opera, Firefox를 사용해보세요.

VB 시리얼 패킷 통신 프로그램

App 프로그래밍
2008/04/21 17:17
 


C# 으로 만들었던 RS232를 이용한 패킷 통신 프로그램을 VB로 만들어 보았다.
C#에서 문제가 되었던 통신 중 프로그램 종료시 다운 현상은 없었다
CPU 사용량은 듀얼CPU 상에서 57% 정도 잡아 먹는다
시리얼 포트 에물레이터 때문인지 아닌지 모르겠지만 생각보다 CPU 사용량이 높다.


C# 다운 현상은 이해가 안간다. C#은 가비지 컬렉터가 있어서
메모리 해제를 자동으로 해 주기 때문에 사용자가 메모리 관리를 해주지 않아도,
해 줄 수도 없다, 문제 발생 확률이 적은것으로 알고 있다.
인터럽트와 레퍼런스 동적배열 사용으로 CLR이 메모리 해제를 못하고 다운 된것
같은데, C# 에 조금 실망이다. 동적배열 부분을 없애고 고정배열로
수정 해보고 다시한번 테스트 해 봐야겠다.


앞의 C# 프로그램과 로직은 비슷하다. 언어 특성상 컨트롤 다루는 부분이 조금 틀릴 뿐이다.


중요한 곳 몇가지만 짚어본다.


'    //////////////////////////////////////////////////////////////////////////
'    //  STX 크기 커맨드 인덱스 (데이타) 체크섬 ETX      // 파일패킷
'    //  1   1    1      2      ?        1      1
'    //  STX 크기 커맨드 인덱스 총바이트수 체크섬 ETX    // 파일정보패킷
'    //  1   1    1      2      3          1      1
'    //  STX 크기 커맨드 인덱스 체크섬 ETX               // 수신성공 수신실패
'    //  1   1    1      2      1      1                 // 7 Byte
'    //  0x01    파일정보
'    //  0x02    텍스트파일전송
'    //  0x03    바이너리파일전송
'    //  0x04    수신에러
'    //  0x05    수신성공
'    //////////////////////////////////////////////////////////////////////////


- 한 패킷은 255 바이트, 패킷헤더들은 7 바이트, 실제 데이타는 248 바이트


- 시리얼 포트를 여러개 사용하여 다중 통신을 하기 위하여, 송수신 데이타
  들은 클래스 모듈 객체를 생성해서 처리했다.


Private m_sInfo(9) As Byte          '송신 파일 정보 배열
Private m_sData() As Byte           '송신 파일 패킷 배열
Private m_sDataSize As Long         '송신 파일 배열 크기
Private m_sDataIndex As Long        '송신 파일 배열 인덱스
Private m_sPacketsCount As Long        '송신 파일 패킷 총 갯수
Private m_sModPacketSize As Byte    '송신 패킷사이즈로 나눈 나머지(마지막) 패킷크기
Private m_sFileSize As Long         '송신 파일 바이트 크기

Private m_rData() As Byte           '수신 파일 패킷 배열
Private m_rDataSize As Long         '수신 파일 배열 크기
Private m_rDataIndex As Long        '수신 파일 배열 인덱스
Private m_rPacketsCount As Long     '수신 파일 배열 총 갯수
Private m_rModPacketSize As Byte    '수신 패킷사이즈로 나눈 나머지(마지막) 패킷 크기
Private m_rFileSize As Long         '수신 파일 바이트 크기

Private m_PacketError As Byte        '송수신시 발생된 에러


- MSComm 의 OnComm 이벤트에서 사용하는 버퍼 관련 변수들은 사용자 type으로
  만들어 다중 통신을 지원하기 위하여 준비했다


Public Type BUF
    rBuf(254) As Byte         '수신 버퍼
    rOffset As Long
    sLast(254) As Byte        '마지막 전송된 패킷. 재전송을 위한
    sLastCount As Byte
    rRealData(254) As Byte    '받은 패킷 중 패킷헤더들을 제외한 실제 데이타
    rRealDataCount As Byte
    rIndex As Long            '수신 패킷의 인덱스
    rCommand As Byte          '수신 패킷 커맨드
End Type


- mscomm 컨트롤의 InputLen 을 0으로 하고 RThreshold = 1 로 했다.


    MSComm1.PortOpen = True
    MSComm1.InputMode = comInputModeBinary    '수신은 바이트 모드로


-  PC 측 수신부


Private Sub MSComm1_OnComm()

    Dim arr() As Byte       '수신버퍼에 들어온 임시 배열
    Dim send() As Byte      '송신할 데이타 임시 배열
    Dim rCount As Integer   '수신버퍼 데이타 갯수

    Select Case MSComm2.CommEvent
   
        ' 오류
        Case comBreak         ' 중지 신호 수신
        Case comFrame         ' 구조적 오류
        Case comOverrun       ' 데이터 손실
        Case comRxOver        ' 수신 버퍼 초과
        Case comRxParity      ' 패리티 오류
        Case comTxFull        ' 전송 버퍼 꽉 참
        Case comDCB           ' DCB 검색 중 예기치 못한 오류
       
        ' 이벤트
        Case comEvCD          ' CD 회선 변경
        Case comEvCTS         ' CTS 회선 변경
        Case comEvDSR         ' DSR 회선 변경
        Case comEvRing        ' 호출음 검출
        Case comEvReceive     ' 이벤트 받음
       
            rCount = MSComm1.InBufferCount    '수신버퍼에 들어온 바이트 갯수
            arr = MSComm1.Input
            For I = 버퍼.오프셋 To 버퍼.오프셋 + rCount - 1    ' -1은 인덱스 때문
                버퍼.rBuf(I) = arr(I - 버퍼.rOffset)
            Next I
            버퍼.rOffset = 버퍼.rOffset + rCount
            MSComm1.InBufferCount = 0        '수신버퍼 비우기
            '여기 까지가 수신버퍼에 255개 바이트 모으기, 패킷 크기만큼 모으기
           
            If 버퍼에 255개나 패킷크기만큼 들어왔나? Then
               
                버퍼.rOffset = 0
               
                If 패킷을 체크해서 올바르지 않으면 Then
                    '에러 처리 루틴
                    '수신 실패 송신
                End If
               
                Select Case 커맨드
                   
                    Case 수신 실패?

                        버퍼.rLast 에 담긴 마지막 송신 패킷 재 전송

                    Case SUCCESS
                       
                        클래스 멤버 변수 m_rData 의 패킷을 인덱스에 맞추어 보낸다
                        인덱스 += 1

                End Select
               
            End If
           
        Case comEvSend        ' 이벤트 보냄
        Case comEvEOF         ' 파일 끝
    End Select

End Sub


- MICOM 측 수신부


위와 같고 SELECT CASE 부분만


Select Case 커맨드
   
    Case 파일정보?
   
        '파일정보에 들어있는 파일크기를 꺼내 클래스 멤버 변수 m_rData 를 ReDim 해 준다
        '수신 성공 송신

    Case FILE_TEXT
   
        'm_rData 배열에 인덱스에 맞게 데이타 넣기
        '수신 성공 송신

    Case FILE_BYTE

        'm_rData 배열에 인덱스에 맞게 데이타 넣기
        '수신 성공 송신

End Select


- 타이머를 이용한 송수신 에러 체크는 뺐다. 테스트가 안된다. 손실이 없어서. 굳이 넣는다면
  파일정보패킷을 보내고 타이머를 0.5초 정도로 셋팅한다. 타이머 인터럽트가 발생하면
  패킷 유실로 수신측에서 완성된 패킷을 못 받았다고 처리를 안 하는 경우이다. 이 때
  보냈던 패킷을 재전송해준다. 최소 1.5초 이내로 정상적인 통신이 재개 된다.


- 다음은 C#의 동적배열을 고정배열로 바꿔서 테스트 해봐야겟다
- 이 모듈들을 이용해서 VB로 10개정도의 다중 컴포트 제어를 해봐야겠다.

이올린에 북마크하기
No received trackback. / No comment.

Trackback Address :: http://viper150.cafe24.com/trackback/62

Prev 1 ... 237 238 239 240 241 242 243 244 245 ... 298 Next
블로그 이미지
이것저것 불펌금지도 퍼다가 담습니다. 외부에 비공개된 페이지 입니다. By. 어른왕자

카테고리

  • 전체 (298)
    • 사는 이야기 (115)
    • 웹 프로그래밍 (102)
    • App 프로그래밍 (22)
    • IT 뉴스&기타 (22)
    • 박한별 (4)
    • 역사&기타지식 (9)

태그목록

  • Dialog Base
  • 일본
  • 만화
  • 생생정보통
  • 대결
  • 오픈오피스
  • 조선왕조실록
  • 몰래카메라
  • 코막
  • 집안일
  • 토렌트
  • 몰카
  • 스프링
  • RISS
  • DataMatrix
  • 게임중독
  • 다이알로그
  • VB
  • 교육
  • Button
  • 황금레시피
  • mybatis
  • 마우스
  • 바코드 이미지 생성
  • 한예슬
  • 획갈림
  • XSS
  • 얻은것
  • 카라타
  • 의자

최근에 올라온 글

  • 보험사의 조정신청 대응방법.
  • 어느 천재의 앞선 시선.
  • [병맛더빙] 누구게..... (1)
  • 韓경제 `회색 코뿔소` 상황...
  • SVN Connector 설치 URL.
  • 군대를 가지 않는 서울대생.
  • “운은 하늘의 귀여움 받는...
  • 목장에서 알바하다가 캐스...
  • [펌]믿고 거르는 관상.
  • 하루에 1세트씩 하면 좋다...

최근에 달린 댓글

  • <p><img src="https://i.imgur... 브레드 01/22
  • <p><img src="https://i.imgur... 브레드 01/22
  • <p><img src="https://i.imgur... 브레드 01/22
  • <p><img src="https://i.imgur... 브레드 01/22
  • <p><img src="https://i.imgur... 브레드 01/22

최근에 받은 트랙백

  • công ty may đồng phục. công ty may đồng phục 01/08
  • Israelnightclub`s recent blo... Israelnightclub`s recent blo.. 01/06
  • Suggested Browsing. Suggested Browsing 01/06
  • similar site. similar site 01/06
  • לאתר הבית שלנו. לאתר הבית שלנו 01/06

글 보관함

  • 2019/03 (1)
  • 2018/12 (1)
  • 2018/09 (1)
  • 2018/08 (1)
  • 2018/02 (1)

달력

«   2021/01   »
일 월 화 수 목 금 토
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

링크

  • Total : 262062
  • Today : 49
  • Yesterday : 46
Tattertools
Eolin
rss

어른왕자's blog is powered byTattertools1.1.2.2 : Animato