C#/일반적인코딩 2008. 11. 21. 00:34

Serial에 대한 볼거없는 MSDN

http://msdn.microsoft.com/ko-kr/library/system.io.ports.serialport.aspx

Serial에 대한 반드시 읽어봐야 하는 문서

http://msmvps.com/blogs/coad/archive/2005/03/23/SerialPort-_2800_RS_2D00_232-Serial-COM-Port_2900_-in-C_2300_-.NET.aspx

크로스쓰레드에 대한 MSDN

http://msdn.microsoft.com/ko-kr/library/ms171728(VS.80).aspx

 

 

세상에는 나처럼 든거없이 떠드는 빈깡통이 있는반면

항상진중하게 자기 할것만 하고 다른이가 정리한것만 보는 착실한 친구들이 있다.

누가 옳고 그른것들은 없다. 세상의 구성원이란게 원래 그런거니까. 그렇게 그렇게 무엇인가가 조화롭게 이루어져 나가는것이 좋은것이라 생각한다.

두개체가 적정비율이 되는것이 가장 중요한것 같다. 비율이 한쪽으로 쏠린다면 결국 서로 좋은게 없지 않을까 한다.

 

상상은 스스로 하기로 하고

지금부터 떠들 깡통의 소리는..

시리얼에 대한것이다. 정말 쉽다.

별게 없다.

 

이글은 단지 심풀하게 시리얼에서 데이터를 받는것을 보여주고자 한다.

왜냐면 내가 해야되는일중에 하나가 전화가 오면 그 전화번호를 화면에서 보여주는데 검색을 통해서 누가 전화를 한지 알려주기 위한것이기 때문이다.

clip_image001

아주 간단하게.. 코딩이 완료되었다.

하지만.. 여기서..

에러를 발견하게 될것인데.

clip_image002

이런에러가 발생될것이다.

이건.. 너무나도 일반적인 이야기 임에도 아직도 질문을 하는 인간들이 많으니.. 상세~~~ 하게 이야기 해보자.

clip_image003

아마도 2.0부터 이렇게 되고.. 그 하위버전에서 처리한다면.. 델리게이트를 외부에서 선언해주고 함수또한 외부에 넣어주고.

구문내에서는.. 호출함수를 적어주면 될것이다.(물론 하위버전에서는 저런 오류가 나오지 않는다.)

굳이 이렇게 귀찮게 코딩을 하는것은 폼클래스에서 돌고있는 쓰레드와

우리가 생성한 시리얼포트에서 처리되는 쓰레드가 말그대로 교차되기 때문이다.

그럴때 교차의 순서를 정해주는 입장이라고 생각하면 되는데…. 즉.. 시리얼에서 데이터를 받아서 그것을 택스트박스에 뿌려주는것을

폼쓰레드의 this.Invoke는 폼의 함수호출을 의미한다.

거기내에서 실제 실행되어야 하는것을 넣어주는것이다.

clip_image004

clip_image005

물론… 폼쓰레드에 넣는게 황당하다고 생각된다면..

clip_image006

이런식으로 textBox의 쓰레드에 넣어도 된다..

여전히 뭔말인지 모르겠다면..

clip_image007

이렇게 만든 아주 간단한.. 폼 파일인데…

이녀석의 쓰레드 개수는

clip_image008

clip_image009

이렇게 15개나 된다. 그냥.. 폼만 만들면.. 대략 9개던가?의 쓰레드가 돌아가는데..

하여간.. 심풀한 폼에도.. 이렇게 쓰레드가 많이 돈다는 이야기다.

그러니 그 녀석들간의 충돌이 문제가 없게 하기위해서는 서로간의 일종의 동기화가 맞아야 하는것이고

 

동기화를 맞춰 주기위해서 저렇게 처리해주는것이다. 물론.. 무식하게.. 동기화고 뭐고

내맘이다 할때는 그럴때를 위해서.. MS이런것도 만들어 두었다.

clip_image010

     

 

using System.IO.Ports;

 

namespace WindowsApplication9

{

    public partial class Form1 : Form

    {

 

        SerialPort port = new SerialPort("COM3", 19200, Parity.None, 8, StopBits.One);

 

        public Form1()

        {

            InitializeComponent();

            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

            port.Open();

            CheckForIllegalCrossThreadCalls = false;

        }

 

        void port_DataReceived(object sender, SerialDataReceivedEventArgs e)

        {

            textBox1.Text += port.ReadExisting();

        }

 

    }

}

 

 

참고로.. 포트 COM3라고 적은것처럼.. 저것과 속도 19200<--- 등등은 장비에 따라 다르니 저게 틀린다면..

들어오는 정보는.. 잡음이라고 생각해야 할것이다.

 

 

위의 크로스 쓰레드에 대한이야기는 네트웍의 채팅프로그램같은것을 만들때도 반드시 알아야 하니..

꼭 숙지(?)고 뭐고 이미 다 알고 있을거라 믿는다.

 

귀차니즘을 무릎쓰고…

image

내부에서 함수로 처리되지 않고 실제적인 델리게이트의 모습으로 이쁘게 처리된다면… 요렇게 해야겠지.

'C# > 일반적인코딩' 카테고리의 다른 글

ListView에서 Drag &amp; Drop  (0) 2008.12.29
C#의 Setting Class  (0) 2008.11.22
폼안의 컨트롤을 foreach로 돌리는법  (2) 2008.11.14
posted by 삶의여유로움
: