통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이
· LiveSeminar  · LiveConference
데브피아 C# 포럼 마을에 오신 것을 환영합니다.
  마을등급 C#   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 비사모 주민 12902 since 2006-12-28
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
개인게시판
[마을 게시판]
구인/구직 게시판
건의 / 운영 제안
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리

 질문&답변 ※ 꼭 답변채택을 해주시어 성의껏 답변해주신 회원님께 감사의 마음을 전하시길 바랍니다.
 c# 시리얼통신 연속으로(?) 데이터 수신하는 문제  | WinForm Program 2020-03-26 오후 4:54:41
paym 번호: 180025 추천:0  / 읽음:74

안녕하세요~ 시리얼통신 수신부 작성하고 있는데요

데이터를 6개씩 수신을 하고 있는데

수신하다보면 한번에 12개 18개 이렇게 붙어서 한번에 수신되는 경우가 있는데

어떻게 분리하면 좋을 지 모르겠습니다

나머지를 버리기에는 유효한 데이터라 버리지도 못하겠고.. 분리하는 방법이 있을까요?

 

 

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            System.Threading.Thread.Sleep(100);
           

            int read_cnt = serialPort1.BytesToRead;

            if (read_cnt > 0)
            {               
                byte[] buff = new byte[read_cnt];
                serialPort1.Read(buff, 0, read_cnt);

               

                txt_state.Text += "[RX] rx data cnt :" + read_cnt + Environment.NewLine;
                txt_state.Text += "[RX] ";
                foreach (var k in buff)
                { txt_state.Text += k.ToString("X2") + " "; }
                txt_state.Text += Environment.NewLine;

            }

       }

 

    

read_cnt > 6 이면 return 시키게 해봤는데 아예 6개가 넘는 데이터 수신시 멈춰버리네요

읽어주셔서 감사합니다

 

 

이 글에 답변 등록하기
 [답변]참고해보세요. 2020-03-26 오후 5:31:39
칡흙 번호: 180027 추천:0  

 

- MSDN 에서 각 함수 인자값 / 리턴값 / 오류값 / 예외처리 확인

- 잘 되는 시리얼 통신 예제 / 유틸리티 프로그램 확인

 

//

Search - CodeProject
http://www.codeproject.com/search.aspx?q=serial+c%23&doctypeid=1%3b2%3b3%3b13

serial c# msdn - Google 검색
http://www.google.com/search?source=hp&ei=mmd8XoSCLcH_wAP_pKOADQ&q=serial+c%23+msdn&oq=serial+c%23+msdn&gs_l=psy-ab.3..0i8i30l2.30.987..1246...0.0..0.205.906.0j4j1......0....2j1..gws-wiz.......0j0i30j0i5i30j0i8i10i30.nnfOQHUtWFI&ved=0ahUKEwiEt4Of3LfoAhXBP3AKHX_SCNAQ4dUDCAY&uact=5

SerialPort 클래스 (System.IO.Ports) | Microsoft Docs
http://docs.microsoft.com/ko-kr/dotnet/api/system.io.ports.serialport?view=netframework-4.8

SerialPort.Read 메서드 (System.IO.Ports) | Microsoft Docs
http://docs.microsoft.com/ko-kr/dotnet/api/system.io.ports.serialport.read?view=netframework-4.8#System_IO_Ports_SerialPort_Read_System_Byte___System_Int32_System_Int32_

SerialPort.ReadByte 메서드 (System.IO.Ports) | Microsoft Docs
http://docs.microsoft.com/ko-kr/dotnet/api/system.io.ports.serialport.readbyte?view=netframework-4.8#System_IO_Ports_SerialPort_ReadByte

C# 시리얼통신 검색결과, 책 검색 : 네이버 책
http://book.naver.com/search/search.nhn?sm=sta_hty.book&sug=&where=nexearch&query=C%23+%EC%8B%9C%EB%A6%AC%EC%96%BC%ED%86%B5%EC%8B%A0

 

 

이 글에 답변 등록하기
 [답변]re:ApiClasser 2020-03-26 오후 7:14:35
ApiClasser 번호: 180028 추천:0  

수신하는 데이턱 6개씩(바이트) 이라고 해도 시스템의 상태에 따라 데이터가 뭉쳐져 들어 오는 경우가 종종 있습니다.

 

그래서 다음 과 같이 처리 합니다.

 

수신 보관용 버퍼를 구성합니다.

 

1. DataReceived 콜함수에서 받은 데이터를 일단 수신 보관용 버퍼에 추가 보관해 둡니다.

 

2. 수신 보관용 버퍼에서 길이나 구분자를 이용해서 원하는 길이 많큼  빼내어 수신처리 합니다.

 

----------------------------------

 

여기서 데이터를 한번에 1개 이상.. 2,3 개 도 수신 되는 경우도 있습니다.

 

그래서 보관된 데이터에서 필요 한 만클 추출 하는 것을 반복 해야 합니다.

 

그리고 빼내고 남은 데이터는 다음 수신 데이터와 잘 붙여 사용해야 합니다.

이 글에 답변 등록하기
 [답변]데이타 수신시 바이트 단위로 읽어도 됩니다. 2020-03-27 오전 2:14:41
늘푸른꿈 번호: 180032 추천:0  

시리얼 통신 데이타량이 많지 않다면 바이트 단위로 읽어서 처리하시면 됩니다.

 

특정 기호가 들어오는 것을 실시간 비교하면서 구분자를 제한하거나 시작 문자를 확인하여

 

무조건 6자씩 읽어도 됩니다.

 

요즘은 통신 라인 자체 노이즈가 적으므로 이렇게 단순하게 만들어도 왠만한 속도에서 잘 수신됩니다.

 

Rx_Buf_1[0] = (byte)SPort_1.ReadByte();

 

이렇게 해서 앞자리 비교하고 나머지 5바이트 받는 루푸 돌리시면 6자리 정확하게 수신됩니다.

 

이런식으로 미리 만들어 놓은 바이트 버퍼에  각 바이트씩 수신후 실시간 비교 넣어서 해보세요

 

피씨 속도가 워낙 빨라져서 이렇게 해도 통신 상태는 양호합니다.

이 글에 답변 등록하기
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2017-서울구로-0055호 / 대표: 홍영준, 서민호
08390, 서울시 구로구 디지털로32길 30, 1211호 / TEL. 02_6719_6200 / FAX. 02-6499-1910
Copyright ⓒ (주) 데브피아. All rights reserved.