Posted
Filed under .NET/C#
요즘 대충 시리얼 통신을 USB를 이용해서 하는 경우가 더러 있는거 같더라구요.....
저도 GPS 모듈 가지고 놀때 USB를 통하여 시리얼 통신을 하곤 하였는데.
그래서 USB장치 인식 하는 법을 응용해서 USB가 인식이 되었을때 자동으로 COM Port를 찾도록 하는 방법을 알려 드리겠습니다.

아래 화면은 대충의 결과물.....
예전에는 버튼을 눌러서 새로고침을 시도 했는데... 지금은
USB인식을 통해 바로 검색하도록 하였습니다..

※인식하는데 다소 3~4초 가량 걸리더라구요
사용자 삽입 이미지

public partial class Form1 : Form
    {
        SerialPort sp = new SerialPort();

        public Form1()
        {
            InitializeComponent();
            GetSerialPort();
        }

        protected override void WndProc(ref Message m)
        {
            UInt32 WM_DEVICECHANGE = 0x0219;
            UInt32 DBT_DEVTUP_VOLUME = 0x02;
            UInt32 DBT_DEVICEARRIVAL = 0x8000;
            UInt32 DBT_DEVICEREMOVECOMPLETE = 0x8004;

            if ((m.Msg == WM_DEVICECHANGE) && (m.WParam.ToInt32() == DBT_DEVICEARRIVAL))//디바이스 연결
            {
                //int m_Count = 0;
                int devType = Marshal.ReadInt32(m.LParam, 4);

                if (devType == DBT_DEVTUP_VOLUME)
                {
                    GetSerialPort();
                }
            }

            if((m.Msg == WM_DEVICECHANGE) &&(m.WParam.ToInt32()  == DBT_DEVICEREMOVECOMPLETE))  //디바이스 연결 해제
            {
                int devType = Marshal.ReadInt32(m.LParam, 4);
                if (devType == DBT_DEVTUP_VOLUME)
                {
                    GetSerialPort();
                }
            }

            base.WndProc(ref m);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                GetSerialPort();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void GetSerialPort()
        {
            listBox1.Items.Clear();

            try
            {
                foreach (string str in SerialPort.GetPortNames())
                {
                    listBox1.Items.Add(str);
                }
                if (listBox1.Items.Count <= 0)
                {
                    listBox1.Items.Add("연결 장치 없음");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
연결/연결해제가 되면 이를 감지하여 시리얼 포트 장치를 재 검색해주도록 하고 있습니다. 예제는 소스 코드를 가지고 응용해 보시면 될듯 합니다...
2012/04/06 16:28 2012/04/06 16:28