[제품종류] IEC1000
[개발환경] Visual Studio 2008 C#
=============== 질 문 ===============SmartSerialPort를 통해 RS-485 통신을 사용하고 있습니다.
이 상태에서 SmartUART를 통해 UART 통신을 하려고 하는데 가능한지요? (UART 및 RS-485 통신을 동시에 사용하려 합니다.)
(COM1 port 아래에 MODE S/W가 있는데 현재는 RS-485 통신을 위해 오른쪽으로 설정 해놓은 상태입니다.)
=============== 답 변 ===============
안녕하세요.
말씀하신 SmartUart는 더이상 지원하고 있지않은 컴포넌트입니다.
문의주신 내용처럼 여러개의 포트를 사용해야하는 경우에는 포트당 SmartSerialPort 컴포넌트를 추가하여
각 SmartSerialPort 컴포넌트 마다 포트를 설정하여 사용하시면 됩니다. ( 컴포넌트를 추가한다는 말은 SmartSerialPort를 두개를 추가하시면
됩니다.)
또한 SmartSerialPort 컴포넌트를 사용하여 RS485 통신을 사용하실 경우 Queue-Event 방식이 아닌
Polling-동기 방식을 사용하셔야 합니다. 아래에 예제 코드를 첨부하오니 참고하시기 바랍니다.
감사합니다.
[예제 코드]
private void btnSerialOpen_Click(object sender, EventArgs e)
{
// 보드레이트를 설정합니다.
smartSerialPort1.Baud_Rate = SmartX.SmartSerialPort.BAUDRATE._9600bps;
// 통신 포트를 설정합니다.
smartSerialPort1.PortNo = SmartX.SmartSerialPort.COMPORTNO.COM3;
// 에러 체크와 관련된 속성을 설정합니다.
smartSerialPort1.ErrorCheckCodeType = SmartX.SmartSerialPort.ERRORCHECKCODETYPES.ASCIICODE;
smartSerialPort1.ErrorCheckMode = SmartX.SmartSerialPort.ERRORCHECK.NONE;
smartSerialPort1.ErrorCode_Location = SmartX.SmartSerialPort.ERRORCODELOCATION.TAIL;
// 수신받은 프레임에서 데이터만 표시합니다.
smartSerialPort1.ReceiveFrameDebugMode = false;
// RS485 소프트웨어 감지를 사용하지 않습니다.
smartSerialPort1.RS485SoftwareDetection = false;
// 버퍼의 크기를 설정합니다.
smartSerialPort1.FrameBufferSize = 50000;
// 통신 환경에 맞는 ReadTimeOut값으로 조절하여 사용하시기 바랍니다.
smartSerialPort1.ReadTimeOut = 100;
// 프레임 구조를 NONEFRAME_READTIMEOUT으로 설정
smartSerialPort1.FrameSeparationType = SmartX.SmartSerialPort.FRAMESEPARATIONTYPES.NONEFRAME_READTIMEOUT;
// 데이터 수신 방식을 Polling 방식으로 설정
smartSerialPort1.ReciveDetect = SmartX.SmartSerialPort.RECEIVEDETECT.POLLING_NONEQUEUE;
if (smartSerialPort1.IsOpen == true)
{
smartSerialPort1.Open();
}
}
private void btnPolling _Click(object sender, EventArgs e)
{
if(smartSerialPort1.IsOpen == true)
{
byte[] bReadByte;
string strSendData = "www.hnsts.co.kr";
// 초기 수신 데이터 상태를 Empty로 설정
SmartX.SmartSerialPort.FRAMEDATAREADSTATUS eStatus = SmartX.SmartSerialPort.FRAMEDATAREADSTATUS.EMPTY;
smartSerialPort1.WriteNoneFrame(strSendData); // NoneFrame 구조로 데이터를 전송하여 요청함
eStatus = smartSerialPort1.ReadNoneFrame(out bReadByte); // NoneFrame 구조로 수신받음
switch (eStatus)
{
case SmartX.SmartSerialPort.FRAMEDATAREADSTATUS.EMPTY:
// 수신된 데이터가 없을 경우
break;
case SmartX.SmartSerialPort.FRAMEDATAREADSTATUS.FAILDATA:
// 비정상적인 데이터가 수신된 경우
break;
case SmartX.SmartSerialPort.FRAMEDATAREADSTATUS.VALIDDATA:
// 정상적인 데이터가 수신된 경우
string strRead = SmartX.SmartSerialPort.ConvertASCIIByteToString(bReadByte);
break;
}
}
}