본문 바로가기
카테고리 없음

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

by YJHTPII 2023. 7. 24.
반응형

 

https://dodo1054.tistory.com/74

 

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

안녕하세요~ 시리얼 통신도 TCP/IP 모드버스 프로토콜과 차이가 많이나지 않습니다! Send Receive 기본틀도 둘다 비슷하구요 단지 요청프로토콜에 앞 헤더를 제외하고 뒤에 CRC가 추가되는 점이 조금

dodo1054.tistory.com

 

 

 

안녕하세요~ 

시리얼 통신도 TCP/IP 모드버스 프로토콜과 차이가 많이나지 않습니다!

Send Receive 기본틀도 둘다 비슷하구요

단지 요청프로토콜에 앞 헤더를 제외하고 뒤에 CRC가 추가되는 점이 조금 다르죠!

 

 시리얼 통신용 기본 요청 프로토콜 입니다.

 

 public static byte[] W_buff =
         {
                0x01,        //ID
                0x04,        //FunctionCode
                0x00, 0x01,  //시작주소 
                0x00, 0x40,  //데이터 길이(64)  
                0x73, 0xFB   //CRC 값 계산필요!
         };

 

CRC 값 구하는 부분은 밑에 링크로 올려두었습니다.

시리얼포트 기본소스입니다.

 

iniPort 메서드는 는 ini파일을 이용하여 가져온 시리얼 포트 연결속성을 설정하는 부분입니다.

통신포트, 속도, 패리티비트, 데이타비트, 스탑비트..

 

나머지 메서드는 메서드 이름과 같은 동작을 하구요!

 

SerialDataReceivedEventHandler 이벤트는 데이터를 읽기위해 필수적인 이벤트입니다.

후에 추가적으로 더 올리도록 하겠습니다 Receive 부분 포함해서요!

궁금한점은 댓글로..

 

 

class TSerialPort
    {
 
        public SerialPort serialport = new SerialPort();
 
        //===========================================================//
        /// <summary>
        /// 시리얼 통신 설정 값 설정 메서드
        /// </summary>
        /// <param name="com"></param>
        /// <param name="baudrate"></param>
        /// <param name="parity"></param>
        /// <param name="data"></param>
        /// <param name="stop"></param>
        public void fn_iniPort(string com, int baudrate, string parity, int data, int stop)
        {
            serialport.PortName = com;
            serialport.BaudRate = baudrate;
            if (parity == "N") serialport.Parity = Parity.None;
            else if (parity == "O") serialport.Parity = Parity.Odd;
            else if (parity == "E") serialport.Parity = Parity.Even;
 
            serialport.DataBits = data;
            if (stop == 1) serialport.StopBits = StopBits.One;
            else if (stop == 2) serialport.StopBits = StopBits.Two;
        }
 
        //=================================================================//
        /// <summary>
        /// 시리얼 포트 오픈
        /// </summary>
        /// <param name="fn_OnDataReceived"></param>
        /// <returns></returns>
        //=================================================================//
        public int fn_Open(SerialDataReceivedEventHandler fn_OnDataReceived)
        {
            int iret = 1;
            serialport.DataReceived += fn_OnDataReceived;
            try
            {
                serialport.Open();
            }
            catch(Exception e)
            {
                iret = -1;
            }
            return iret;
        }
 
        //=====================================================================//
        //시리얼 포트 연결 종료
        //=====================================================================//
        public void fn_Close(SerialDataReceivedEventHandler fn_OnDataReceived)
        {
            if (serialport.IsOpen)
            {
                serialport.Close();
                serialport.DataReceived -= fn_OnDataReceived ;
            }
        }
 
        //=====================================================================//
        //데이터 요청
        //=====================================================================//
        public void fn_Send(byte[] buffer, int offset, int count)
        {
            //보낼데이터(버퍼값), 번지수, 데이터 개수)
            serialport.Write(buffer, offset, count);
        } 
    }
 

 

 

반응형

댓글