richTextBox2.Text += string.Format("{0:x}", serialPort1.ReadByte());
richTextBox에 이런식으로 넣으면 확인할 수 있다.
하지만 이 명령어를 아무 곳에다가 넣었다가는 프로그램이 멈춰버리는 현상이 일어난다.
이는, ReadByte()라는 명령어의 특성 때문인데, ReadByte()는 수신된 데이터가 있으면 이를 읽어오지만, 수신된 데이터가 없으면 수신될 때까지 기다리는 녀석이다.
때문에, 시리얼포트로 데이터가 수신돼었다는 것을 확신할 수 있을 때만 사용해야한다.
그럼 언제 데이터수신을 확신할 수 있느냐?
바로 DataRecieved()라는 녀석이다.
시리얼포트에 데이터가 수신되면 호출되는 함수이기때문에, 이 녀석을 이용하면 데이터가 수신되는 것을 확인할 수 있다.
하지만 DataRecieved()는 데이터가 수신되는 순간 호출되기 때문에 내가 원하는 시간에 이 함수를 호출할 수는 없다.
그렇다면, 시리얼포트로 어떠한 데이터가 수신되었고 이 후에 원하는 어떤 시간에 내가 원하는 명령을 줄 순 없을까?
다시말해,
1초에 한 번씩 어떤 함수를 호출해야하는데, 조건이 시리얼포트로 데이터가 수신되었을 때만 호출하는 것이다.
즉, 1초에 한번씩 Count하는데, 시리얼포트에 데이터가 수신되었을 때만 Count를 두 개씩 올려야한다면?
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
serial1_flag = true;
}
이와 같이 serial1_flag라는 BOOL타입의 변수를 전역변수로 지정한 다음, DataReceived가 호출되면 이 녀석을 true로 만든다.
그리고 1초에 한 번씩 tick이 걸리는 타이머에서
if(serial1_flag)
{
do sth you want();
serial1_flag = false;
}
이러면 해결할 수 있다.
'자기전엔 전기전자 > ZUN장군의 허접 C# 강좌' 카테고리의 다른 글
| 디버깅 오류: "잘못된 크로스 스레드 작업: '컨트롤 이름' 컨트롤이 자신이 만들어진 스레드가 아닌 다른 (0) | 2010/05/27 |
|---|---|
| C#] Timer를 이용한 스톱워치(stopwatch) 만들기 (0) | 2010/05/16 |
| 리치텍스트박스(richTextBox)에서 한 줄씩 읽어오기 (0) | 2010/05/12 |
| C# usb 시리얼포트 찾기(콤보박스에 자동 추가) (0) | 2010/05/06 |
| MS VisualStudio 2010 무료다운로드(DreamSpark) (0) | 2010/04/24 |
| C#, serialport에서 바이트 수신 시 무한루프에서 빠져나오는 방법 (0) | 2010/03/26 |
| unsigned long의 크기 (1) | 2010/03/22 |
| C#에서 클래스 변수 생성 시 에러메시지 (--- is inaccessible due to its protection level) (0) | 2010/03/18 |
| C#에서 시리얼통신(how to use serial communication in C#) (3) | 2010/03/06 |
| 다른 폼에서 직렬화(serialize)해서 저장한 파일 열기 (0) | 2010/02/26 |
| C#에서 #define 을 이용한 상수정의 (1) | 2010/02/25 |


