본문 바로가기
공부/C#

C# SerialPort 송수신..

by ding9 2012. 7. 9.

 

 

프로젝트 중에 serial통신하는게 있어서 serialport 기능을 써봤다....

 

MFC때 겁나 오랜시간동안 데이터 안들어오네 들어오네.. 값이 깨지네 마네... 프로그램 뻗었네 마네... 거기다가 오실로스코프까지 사용해가면서 했었던게 엊그제 같은데.....

 

오늘은 검색 몇번으로 30분만에 해결...ㅎㅎㅎ

 

일단 윈폼프로젝트를 생성한담에 도구상자에서 serialport를 선택해서 윈폼에 밀어넣으면 작업창 밑에 추가 된다...

 

 

고럼 일단은 선언이나 전송속도, 뭐 등등등 알아서 선택된다.

 

근데 중요한건 serialport는 PC에서 COM1, COM2 요딴식으로 붙는데 2~3개씩 붙는 경우도 있기 때문에 COM1, COM2를 선택할수 있도록 해주는게 좋다.

 

준비물은... 나는 usb to serial 이 있어서.. 그놈 serial의 2,3번을 쇼트시키고 진행했는데 그게 없으면 serial 통신 할수 있는 보드로 rx,tx를 쇼트시키던지 해야함.... 안그럼 이걸 프로그램해둬도 test못함..;

 

그래서 준비물을 준비하고 프로그램으로 와서....

 

우선은 윈폼에 combobox를 한개 추가하고... 데이터가 제대로 오는지 보기위해서 입력용 textbox와 출력용 textbox를 추가한다... 이때 출력용은 Multiline을 true로 바꿔준다.....

 

그리고 데이터를 보내기 위해서 버튼을 추가해서 send용으로 만든다.

 

요렇게 만들고 버튼에 클릭 이벤트와 serialport에 데이터리시브이벤트, combobox에 selectedindexchanged 이벤트를 추가하고....그리고 윈폼이 닫힐때 serialport도 닫아줘야 하니까 윈폼닫힘 이벤트를 추가한다....

 

이제부터 소스를 추가하면.....

 

생성자에는 PC에 붙어있는 모든 serialport를 읽어올수 있도록 아래 소스를 추가한다.

 

            string[] port_arr = SerialPort.GetPortNames();

            foreach (string portno in port_arr)
            {
                comboBox1.Items.Add(portno);
            }
            cnt = 1;
            if (serialPort1.IsOpen) serialPort1.Close();

 

마지막에 if문은 열려있었음 닫으란 소린데... 이건 솔직히 안해줘도 될듯...ㅡㅡ;;

 

일단 cnt는 신경쓰지마시길... 소스에 cnt나 주석은 신경쓰지마시길...

 

암튼 글고 버튼이벤트는 데이터를 보내기 위한 것이므로

 

textBox1.Text = " f0 " + textBox1.Text + " 0f ";

//            textBox1.Text += " f0 " + cnt++.ToString() + " 0f ";
            serialPort1.Write(textBox1.Text);

 

요거 추가하고...

 

combobox 이벤트는 포트가 선택되었을때 기본적인 설정을 해주는 것이므로... 일단은... 간단하게 속도랑 포트이름만 넣고 열어준다..

 

            serialPort1.PortName = comboBox1.Text;
            serialPort1.BaudRate = 9600;

            serialPort1.Open();

 

그리고 데이터가 들어오면 발생되는 이벤트는...

 

            textBox2.Text += serialPort1.ReadExisting();
            MessageBox.Show("우와 메시지 들어왓어!!");

 

serialPort1.ReadExisting()이녀석은 데이터 읽어오기가 끝났을때 버퍼에 저장된 녀석을 리턴해줌.....

 

메시지박스는 그냥 함 넣어봤음...ㅡ0ㅡ)b

 

.. 아 그리고 마지막으로 윈폼이 닫힐때 serialport를 닫아줘야 하니까 윈폼닫힘 이벤트를 추가해서 serialport를 닫는다.

 

            serialPort1.Close();

그리고 이젠 바로 실행을 하면...

 

 

내 PC에는 총 3개의 serialport가 연결되었는데 그중에 1개만 진짜.. 나머진 뭔지 모르겠음..ㅡㅡ;; 암튼 그놈을 선택(port가 어떤것이 진짜인지 아는 방법은 다 알것으로 생각하므로 패스~~~)

 

 

가운데 입력창에 데이터를 입력하고 send를 누르면..... 

 

 

메시지 창이 뜨고...

 

요렇게 나온다...

 

그런데 하다보니 문제점이....

 

ttesag를 쓰고 버튼을 한번 눌렀는데 입력칸에 f0 ttesag 0f가 뜨는건 이해하지만.... 왜 출력창에 처음데이터인 ttesag가 나오는지 모르겠음...;;

 

그래서 2번의 메시지 창이 뜨는데.. 요건 아무래도 += 때문인듯한데 연구가 필요할듯...;;;

 

요런거 나올때마다 실력의 한계가 느껴진다는...ㅎㄷㄷ;;;;;

 

이제 왠만한 기능구현이 거의 다 됐으니 이제 요넘들 합칠일만 남음...

 

후딱 해치워야지..ㅎㅎㅎㅎ~~

반응형

댓글