2010년 1월 21일 목요일

WPF에서 직렬(시리얼)전송은 어떻게 할 수 있나요?

출처 : 데브피아

WPF에서 직렬(시리얼)전송은 어떻게 할 수 있나요? | Other
2009-04-16 오후 3:52:36

김창길 (hanbyi) 김창길님께 메시지 보내기김창길님을 내 주소록에 추가합니다.김창길님의 개인게시판 가기
번호: 108998  / 읽음:80

일반 윈도우 응용프로그램에서는 SerialPort 컨트롤을 사용하여 직렬전송 작업을 할 수 있는데, WPF 응용프로그램으로 작업할 경우 직렬포트와 연결된 장치와의 송수신은 어떤 방식으로 가능한가요?

WPF로 작성된 페이지가 UI면에서 좋을 것 같아서 이런 생각을 해봤는데요. 가능할지도 궁금하구요. 가능하다면 어떻게 구현할 수 있을지 궁금합니다.

P.S

WPF카테고리에도 같은 질문이 있는데요. 그쪽은 조회가 많이 일어나지 않는 듯하여 부득이 이곳에도 올리게 되었습니다. 결과 확인하고 답변 없는 곳의 글은 삭제하도록 하겠습니다. (죄송해요~)

이 글에 답변 등록하기

[답변]
2009-04-16 오후 5:48:43

이학수 (hitoo86) 이학수님께 메시지 보내기이학수님을 내 주소록에 추가합니다.이학수님의 개인게시판 가기
번호: 109017 

System.IO.Ports.SerialPort 

라고 있습니다.. Control 이구요...

System.IO.Ports.SerialPort  serial1 = null;

로 전역으로 선언하신후.. 사용하시면 될겁니다.~~

이 글에 답변 등록하기

[답변]감사합니다. 됩니다.(냉무)
2009-04-17 오전 10:24:21

김창길 (hanbyi) 김창길님께 메시지 보내기김창길님을 내 주소록에 추가합니다.김창길님의 개인게시판 가기
번호: 109059 

이 글에 답변 등록하기

[답변][재요청]이벤트가 발생을 안해요~
2009-04-16 오후 6:44:07

김창길 (hanbyi) 김창길님께 메시지 보내기김창길님을 내 주소록에 추가합니다.김창길님의 개인게시판 가기
번호: 109035 

먼저 답변 감사합니다.

안그래도 그방법으로 해봤는데요, DataReceived이벤트가 발생하지 않더라구요. (물론 일반 윈도우응용프로그램으로 작업했을때는 송수신 잘되는데, WPF로 할 경우에 그렇더라구요)

그래서 다른 방법이 있지 않나 싶어 여쭙게 됐습니다.

        private System.IO.Ports.SerialPort _spCOM = null;

        public void Init(string sPortName, int iBaudRate, Parity parity, int iDataBits, StopBits stopBit)
        {
_spCOM = new SerialPort(sPortName, iBaudRate, parity, iDataBits, StopBits.One);
_spCOM.DataReceived += new SerialDataReceivedEventHandler(spCOM_DataReceived);
            _spCOM.ReceivedBytesThreshold = 1;

            if (_spCOM.IsOpen)
            {
                _spCOM.Close();
                _spCOM.Open();
            }
            else
            {
                _spCOM.Open();
            }

        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            _spCOM.Write("Hello\n");

        }

void spCOM_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                string sRes = _spCOM.ReadExisting();

            }
            catch (Exception ex)
            {
            }
        }

뭐 대충 이런식으로 작업했거든요...

혹 뭐 빠뜨린거라도 있을까요?

이 글에 답변 등록하기

[답변]답변
2009-04-16 오후 7:34:04

이학수 (hitoo86) 이학수님께 메시지 보내기이학수님을 내 주소록에 추가합니다.이학수님의 개인게시판 가기
번호: 109038 

private System.IO.Ports.SerialPort _spCOM = null;

        public void Init(string sPortName, int iBaudRate, Parity parity, int iDataBits, StopBits stopBit)
        {
_spCOM = new SerialPort();
_spCOM.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(spCOM_DataReceived);

          _spCOM.BaudRate = ??;

          _spCOM.PortNamd = "COM?";
            _spCOM.ReceivedBytesThreshold = 1;   <-음 뭐 이건 없어도 상관없음

            if (_spCOM.IsOpen)
            {
                _spCOM.Close();
                _spCOM.Open();
            }
            else
            {
                _spCOM.Open();
            }

        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            _spCOM.Write("Hello\n");

        }

void spCOM_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                string sRes = _spCOM.ReadExisting();

_spCOM.DiscardInBuffer();   <-혹시나 Form렉걸리면서 버퍼가 오버칠수도 있으므로~

            }
            catch (Exception ex)
            {
            }
        }

음 간단한 부분 몇가지가 빠진거 같네요~~ 빨간색으로 표시한부분이 수정한 부분입니다~

ㅅㄱ하세요~

댓글 없음:

댓글 쓰기