C\#SerialPort 비동기 읽 기 요약

5955 단어 port
필 자 는 C+++를 처음 배 웠 을 때 성숙 하지 않 은 직렬 디 버 깅 조수 연습 가 를 썼 고 예전 에 자바 로 serial Port 를 쓴 적 이 있 으 며 한 경기 에서 드디어 SerialPort 에 대해 전문 적 인 연 구 를 했다.다음은 단지 개인 노트 일 뿐이다. 
C\#직렬 통신 에 사용 되 는 System.IO.Ports.SerialPort 류 를 제공 하여 직렬(RS 232 지원,RS 485 에 대해 필 자 는 시도 하지 않 았 음)의 읽 기와 쓰기 작업 을 편리 하 게 할 수 있 습 니 다.
몇 가지 특징
SerialPort 에 대해 다음 과 같은 몇 가지 주의 할 점 이 있 습 니 다.
1,ReadLine 은 동기 화 읽 기 에 만 사용 할 수 있 습 니 다.데이터 가 없 을 때 이 함 수 는 막 힐 것 입 니 다.
2.SerialPort 에서 read 시리즈 함수(Read,ReadByte,ReabChar,ReadLine,ReadExisting 등)를 호출 할 때 버퍼 란 필요 하지 않 거나 읽 은 데 이 터 를 사용자 가 정의 하 는 byte[]또는 string 형식의 변수 로 직접'흐름'합 니 다.Write 에 대해 서도 마찬가지다.그래서 flushRx 나 flushTx 라 는 개념 은 존재 하지 않 는 다.
3.상기 한 바 와 같이 직렬 포트 자체 의 버퍼 가 존재 합 니 다.즉,하위 기기 에서 보 낸 데이터 가 읽 히 지 않 으 면 데이터 양 이 버퍼 크기 를 초과 하지 않 은 상태 에서 계속 쌓 입 니 다.필 자 는 이 문제 에 있어 서 자신의 소홀 로 인해 불필요 한 번 거 로 움 을 초래 한 적 이 있다.
4.SerialPort 의 읽 기 데이터 함수 가 다양 합 니 다.위 에서 언급 한 Read,ReadByte,ReabChar,ReadLine,ReadExisting 은 모두 호출 할 수 있 습 니 다.일정한 형식 에 맞 는 직렬 패 킷(비트 흐름)을 읽 었 지만 효과 가 다 릅 니 다.구체 적 인 원인 에 대해 필자 도 잘 모 르 겠 습 니 다.직렬 통신 의 바 텀 과 응용 층 이 모두 정통 한 고수 에 게 대답 해 야 합 니 다.어 리 석 은 필자 의 테스트 를 통 해 그 함수 들 은 두 가지 로 나 눌 수 있 는데 하 나 는 readbyte,즉 ReadByte,Read 등 이다.그들 이 읽 은 데 이 터 는 byte 변수 에 저장 된다.다른 하 나 는 readchar 입 니 다.예 를 들 어 ReadChar,ReadExisting 등 두 사람 이 읽 은 데이터 가 다 릅 니 다.내 시험 에서 readbyte 함수 가 ff ff 를 읽 었 을 때 readchar 함수 가 3f 3f 를 읽 었 다.
5.직렬 포트 가 정확 한 수 치 를 읽 지 못 하면 장치 인 터 페 이 스 를 삽입 해 볼 수 있 습 니 다.그 이 유 는 까지 고수 의 지 도 를 구 할 수 있 습 니 다!
코드 부분
내 헛소리 듣 기 싫어?그럼 코드 를 직접 보 세 요.
1,기본 매개 변수 설정
1   //  SerialPort

2 

3   SerialPort serp = new SerialPort();

4 

5   serp.BaudRate = 115200;

6 

7   ......//  msdn

2,수신 관련 매개 변수 설정
 
1   //      。    ,   Exception

2 

3    serp.serialport.ReadTimeout = 90 * 1000;

4 

5   //        

6 

7   serp.serialport.DataReceived += new SerialDataReceivedEventHandler(this.serialport_DataReceived);

8 

9   serp.Open(); 

3,수신 이벤트 처리 함수 정의
 1   //        

 2 

 3   private serialport_DataReceived(Object sender, SerialDataReceivedEventArgs e)

 4 

 5   {

 6 

 7     try{

 8 

 9       Thread.Sleep(100);  //(  )      ,         int len        

10 

11       int len = serp.BytesToRead;

12 

13                  if( len!=0 )

14 

15       {

16 

17                    byte [] buff = new byte[len];

18 

19         serp.Read(buff, 0, len);

20 

21         //try some other functions to read? do yourself if intersted

22 

23         //processing data in buff

24 

25       }

26 

27     }

28 

29   }

좋은 웹페이지 즐겨찾기