반응형
https://dodo1054.tistory.com/74
안녕하세요~
시리얼 통신도 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);
}
}
반응형
댓글