public partial class BitTest : Form
{
        const char STX = (char)0x02;
        const char ETX = (char)0x03; //End Text [응답용Asc]
        const char EOT = (char)0x04; //End of Text[요구용 Asc]
        const char ENQ = (char)0x05; //Enquire[프레임시작코드]
        const char ACK = (char)0x06; //Acknowledge[응답 시작]
        const char NAK = (char)0x15; //Not Acknoledge[에러응답시작]
        private SerialPort m_serialPort;
    
        public BitTest()
        {
            InitializeComponent();
        }
 
        private void WordReadTest_Load(object sender, EventArgs e)
        {
            SerialPortOpen();
        }
 
        private void WordReadTest_FormClosing(object sender, FormClosingEventArgs e)
        {
            SerialPortClose();
        }
        private void btnOpen_Click(object sender, EventArgs e)
        {
            SerialPortOpen();
        }
 
        private void btnClose_Click(object sender, EventArgs e)
        {
            SerialPortClose();
        }
 
        /// 
        /// 포트오픈
        /// 
        private void SerialPortOpen()
        {
            m_serialPort = new SerialPort();
            m_serialPort.PortName = "Com7";
            m_serialPort.BaudRate = 19200;
            m_serialPort.Parity = Parity.None;
            m_serialPort.DataBits = 8;
            m_serialPort.StopBits = StopBits.One;
            m_serialPort.Handshake = Handshake.None;
            m_serialPort.ReadTimeout = 500;
            m_serialPort.WriteTimeout = 500;
            m_serialPort.Open();
 
            btnOpen.Enabled = false;
            btnClose.Enabled = true;
            btnExecute.Enabled = true;
        }
        /// 
        /// 포트 종료
        /// 
        private void SerialPortClose()
        {
            m_serialPort.Close();
            btnOpen.Enabled = true;
            btnClose.Enabled = false;
            btnExecute.Enabled = false;
        }
 
        //실행
        private void btnExecute_Click(object sender, EventArgs e)
        {
            DateTime t1 = DateTime.Now;
            string strOutputData = ENQ + "00RSS01" + "07%MX0000" + EOT;
            m_serialPort.Write(strOutputData);
            lblOutputData.Text = strOutputData;
            do
            {
                //데이타를 전부 PLC로 전송 하기 위함..
            } while (m_serialPort.WriteBufferSize == 0);
            string indata= DataRead();
            TimeSpan span = DateTime.Now.Subtract(t1);
            lblMillisecond.Text = span.Milliseconds.ToString();
        }
 
        /// 
        /// PLC로 부터 수신된 데이타를 가지고 온다
        /// 
        /// 
        private string DataRead()
        {
            bool m_Next = false;
            string strInData = string.Empty;
            string strRetValue= string.Empty;
        
            DateTime start = DateTime.Now;
            do
            {
                string msg = m_serialPort.ReadExisting();
                strInData += msg;
                //TODO : 데이타에 종료문자가 있으면...
                if (msg.IndexOf(ETX) > 0)
                {
                    //TODO 데이타 처음에 정상 응답이 있으면
                    if (strInData[0] == ACK)
                    {
                        //TODO 들어오는 데이타를 분석..[ETX(1)+국번(2)+비트읽기(3)+블륵수(2)]
                        lblInputData.Text = strInData;//Test용
                        strRetValue = strInData.Substring(8, strInData.Length - 9); //실제Data
                        m_Next = true;
                    }
                    //TODO: 데이타에 비정상 응답이 들어오면..
                    else if (strInData[0] == NAK)
                    {
                        lblInputData.Text = "NAK";
                        strRetValue = "-1";
                        m_Next = true;
                    }
                }
                //DOTO : 응답이 없으면 0.5초간은 로프를둘면서 기다란다.
                TimeSpan ts = DateTime.Now.Subtract(start);
                if (ts.Milliseconds > 500)
                {
                    lblInputData.Text = "TimeOut";
                    strRetValue = "-3";
                    m_Next = true;
                }
            } while (!m_Next);
            return strRetValue;
        }
    }
}

블로그 이미지

벵거빠돌이

,