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
Posted
Filed under .NET/C#

MDI 폼에서....
자식창이 한번에 띄워져 있는 경우...
이를 일일이 닫기 귀찮거나...
필요에 따라서 한번에 닫아야 하는 경우가 있을 껍니다... (아마도...요...)

foreach (System.Windows.Forms.Form TheForm in this.MdiChildren)
{
    TheForm.Dispose();
}

위 소스는... MDI 폼에서 자식창을 한번에.. 닫아주는 방법입니다...
(특정 메뉴에서.... 뭐 창 전부 닫기 버튼이라도 클릭시..... 등등..)
해당 메소드 안에서 해당 구문을 넣어 주십 됩니다...

※ 보나스 TIP(?)
MDI 로 작성하다가 자식 창을 새로 띄우게 되면.. 자식장의 이름이 제목 표시줄에 나타나게 되는데...
frmP frm = new frmP();
frm.MdiParent = this;
frm.Show();

자식장을 띄울 때.. 위 코드와 같이 부모창에서 MdiParent= this; 를 한번 넣어 봅니다..
2011/08/29 14:49 2011/08/29 14:49