본문 바로가기
공부/C#

C# serialport 데이터 주고받기 test 시 주의점( ReadByte와 ReadExisting)

by ding9 2012. 7. 20.

 

Serialport 테스트시 usb to serial에 rx와 tx를 쇼트 시켜서 내가 보낸 데이터를 그대로 받는 식으로 프로그램을 구성했었는데...

 

이게 문제가 있다...

 

그건 바로 데이터길이가 100 byte 이상(아직 정확하게 몇byte 이상인지는 잘모르겠고... 264byte를 날렸었다) 보내서 바로 받을때 data가 씹히는 경우가 있다. 물론 ReadByte를 사용해서 값을 불러올때 데이터가 씹히는 현상이 일어났고 ReadExisting은 거의 없었다.

 

일반적으로 테스트를 하기 위해서는 ReadExisting을 사용하면 현재 받은 데이터를 한번에 모두 가져오기때문에 데이터가 씹히는 경우가 거의 없었으나....

 

나는 하드웨어랑 연동해서 해야되기때문에 한번에 string으로 읽어오는 ReadExisting은 적합하지 않아서 ReadByte로 읽어오니.....

 

이게 뭥미...ㅡㅡ;; 데이터가 막 씹히고 안오고 난리난다....

 

serialport특성상 데이터를 수신 받을때 전체 데이터를 가지고 오는 경우도 있지만 분할해서 가져오는경우도 있다. 그래서 DataReceive함수를 만들어줄때 이점에 주의해줘야한다.

 

다시말하면 264byte를 한번에 가져오는 경우도 있지만 2번에 나누거나 3번 이상으로 나눠 받아오는 경우도 있으니 통신시 rx 데이터를 저장할 변수는 주고받는 데이터의 크기가 일정하지 않은경우 가장 큰 크기로 해서 변수를 지정해놓는것이 좋고 함수 구성시 이런 경우에 대비해야한다....

 

쨋든 readbyte의 경우 1 byte씩 읽어와서 저장을 해야하므로 데이터를 읽는데 시간이 필요한데 그 시간안에 또 다른 데이터가 도착하면 그때부터 씹히기 시작한다...

 

물론 board to board나 board to PC로 통신할 시에는 주고 받는 시간이 충분하기 때문에 상관없지만..

 

내가 기존에 구성한 프로그램처럼 한포트에서 데이터를 바로 보내서 바로 받는 경우... 그리고 반드시 ReadByte로만 받아야 되는 경우에는 test 데이터의 크기를 설정하는데 신경을 써줘야할것이다.

 

 

 

위 그림은 0~255까지 데이터를 보내면 바로 받아서 우측하단에 표시하도록 만들었는데  DataReceive에 단순히 아래 코드만 넣어줬을 뿐인데도 데이터가 전부 수신이 되지 않는다.


            textBox4.Text += serialPort1.ReadByte().ToString();

 

보내기를 계속 누르면 뒤에 숫자 다음 숫자 부터 온다... 아마도 보내고 있는데 받으니 보내기를 중단하고 받고 기다렸다가 다시 받는... 이런 답답해서 미칠지경의 노릇을 하고 있는것이다... 그래서 계속 보내기 버튼 누르면 결국엔 255까지 보내기는 하는데 딱 거기서 멈추는게 아니고 몇개의 데이터가 더 붙는다...

 

물론 그 데이터는 0부터 다시 시작해서 0123456 요런식으로 붙는다...

 

암튼 한포트로 테스트를 해야한다면.... 테스트 데이터는 많지 않은 갯수를 선택하는 것이 심적으로 좋다...ㅡㅡㅋ

반응형

댓글