본문으로 바로가기

C# 모드버스 RTU 시리얼통신 구현하기2

category C# 2019. 8. 6. 13:34
반응형

안녕하세요 시리얼통신 두번째 소스입니다.

TKMain 클래스가 TSerialPort 클래스를 상속받아 TSerialPort 의 메소드들을 오버라이딩 하고 있는 부분입니다.

이전 글에서 말씀드렸지만 OnDataReceived 메서드는 응답받기 위한 필수적인 이벤트인 DataReceivedEvent...

를 사용하고 있습니다.

 

serialport.BytesToRead 는 데이터를 받고 ReadData 변수에 넣은 부분입니다.

 

seriaport.Basestream.Read(R_buff, ReadData2, ReadData); 역할은

R_buff 에 ReadData2(저장할 시작번지) 부터 ReadData 개수만큼 저장한다 입니다.

또한 R_buff 를 cR_buff 에 126개만큼 복사하여 cR_buff 에 헤더값과 CRC를 제외한 측정치 값을 가질 수 있도록

하였습니다.

 

Send 부분은 부모클래스의 fn_Send 메서드를 사용하였습니다.  

 

저 같은 경우 queue 버퍼 클래스와 쓰레드 타이머 클래스를 사용하기에 두 클래스를 이용여 Send 메서드를 사용하였습니다.

queue 클래스 역할은 순차적으로 들어온 데이터를 순차적으로 빠져나가게끔 정의한 클래스입니다

쓰레드 타이머 부분은 Tcp/IP Client 부분에 정의되어 있을거에요!

 

설명이 조금 부족한데.. 궁금하신부분은 쪽지나 댓글로 말씀해주세요!ㅠㅠ

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
 class TKMain : TSerialPort
    {
        
        public int ReadData2 = 0;
        
 
        //============================================//
        //ClientOpen 메서드
        //============================================//
        public int Kopen()
        {
 
            fn_Open(KOnDataReceived);
            int iret = 1;
            return iret;
        }
 
        //==================================================//
        //ClientClose 메서드
        //==================================================//
        public void KClose()
        {
            if (serialport.IsOpen == true)
            {
                fn_Close(KOnDataReceived);
                serialport.DataReceived -= KOnDataReceived;
            }
        }
 
        //======================================================//
        //데이터 리시브 함수
        //=====================================================//
        public void KOnDataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            int ReadData;
            
            //읽은 데이터를 ReadData 변수에 넣음
            ReadData = serialport.BytesToRead;
            if (ReadData > 200 || ReadData2 > 200)
            {
                ReadData2 = 0;
            }
            ReadData2 += ReadData;
            //측정치 데이터 요구했을 때
            
            //01, 04, 7E(126) (번호, 시작주소, 개수)
            if (ReadData2 == 133 && TData.R_buff[1== 0x04)
            {
                Array.Copy(TData.R_buff, 3, TData.cR_buff, 0126);
                TData.ReadCnt++;
                
                ReadData2 = 0;
            }
         //===================================================//
        //쓰레드 타이머 - 콜백함수(요청)
        //==================================================//
        public void KCallback(object o)
        {
            byte[] SetBuff = new byte[256];
           
            if (serialport.IsOpen == true && Kopen() == 1)
            {
             
                if (TData.Wbuff.queue_WAITBUFF.Count == 0)
                {
                    //W_buff 버퍼 값을 0번쨰부터 8개 전송
                    fn_Send(TData.W_buff, 08);
                }
                else
                {
                    byte[] sbuf = new byte[10];
                    sbuf = TData.Wbuff.queue_WAITBUFF.Dequeue();
                   
                }
                TData.SendCnt++;
               
            }
        }
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

방문자 분들 모두 즐거운 하루, 행복한 하루 보내세요! 

[C#] - C# 모드버스 RTU 시리얼통신 구현 폼 (주석 추가, 소스 공개)

 

C# 모드버스 RTU 시리얼통신 구현 폼 (주석 추가, 소스 공개)

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using Syste..

dodo1054.tistory.com

[C#] - C# 모드버스 RTU 시리얼통신 구현하기 (주석 추가, 소스 공개)

 

C# 모드버스 RTU 시리얼통신 구현하기(주석 추가, 소스 공개)

메인 클래스에서 참조(상속)하고 있는 시리얼통신을 위한 기본소스(중요) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.Ports; using System.Threadi..

dodo1054.tistory.com

[C#] - C# 모드버스 RTU 시리얼통신 구현하기2 (주석 추가, 소스 공개)

 

C# 모드버스 RTU 시리얼통신 구현하기2 (주석 추가, 소스 공개)

안녕하세요 모드버스 시리얼 통신에 대해 소스 요청이 많아 테스트로 작성한 코드입니다. 블로그에 기존에 작성된 소스를 기반으로 작성했으며 클래스를 상속하여 오버라이딩한 부분도 같습니

dodo1054.tistory.com

[C#] - C# 모드버스 RTU 시리얼통신 구현하기

[C#] - C# Modbus RTU CRC 구하기

[C#] - C# TCP/IP Client Part.1 [기본소스]

[C#] - C# TCP/IP Client Part.2

반응형

'C#' 카테고리의 다른 글

C# DNS 로 서버 접속하기  (0) 2019.08.30
C# 날짜 Log 파일 만들기  (0) 2019.08.21
C# 모드버스 RTU 시리얼통신 구현하기  (59) 2019.08.05
C# Modbus RTU CRC 구하기  (0) 2019.07.29
C# ini 파일 이용하기  (0) 2019.07.19