|
RS-422 방식의 경우 송/수신 간에 하드웨어적으로 +/- Differential 방식으로 데이타를 전송하기 때문에
Noise Cancel 효과를 갖고 있어서 케이블을 길게 써도 무난하게 사용할 수 있지만
RS-232 방식의 경우는 Differential 방식이 아니라서 비트스트림이 쉽게 깨질수가 있죠.
또한 TCP 와 같은 프로토콜과는 달리 데이타 전송의 무결성을 보장하는 것도 아니고요.
보통 케이블을 간단하게 하기 위해서 3선을 많이들 쓰는데, 이런식으로 하면 RTS, CTS 같은
신호전송간의 하드웨어적인 핸드쉐이킹 기능을 사용할 수 없게 됩니다.
케이블을 3선으로 사용하지 말고, RTS CTS 등의 하드웨어적인 핸드쉐이킹이 가능하도록
풀 케이블을 사용하세요.
그리고 양단에서 사용하는 프로그램도 패터티와 플로어 콘트롤을 사용하도록 RS232 칩을
설정하도록 코딩하고, 시리얼통신 자체가 데이타의 무결성을 보장하는 프로토콜이 아니니까
CRC 체크 코드를 이용해서 정상적인 데이타가 아닌 경우, 데이타를 다시 보내도록하는
루틴도 코딩해주어야 합니다.
김태선 님이 쓰신 글 :
: 115200까지 올려 써도 매우 안정적이고
: 절대 주고 받는 데이타에 에러나는 법이 없습니다.
: 만드신 프로그램 코드를 잘 살펴보세요.
:
: 컴포넌트 자체는 아무런 이상이 없습니다.
:
:
: newhuni 님이 쓰신 글 :
: : CPort 3.10을 사용하고 있습니다.
: : 9600에서는 잘 사용하다 이번에 38400으로 사용하려고 합니다.
: :
: : 그냥 수신 이벤트 함수에서 Count로 전달된 만큼 버퍼를 파일에 기록해서 보는데
: : 데이타 중간 중간에 이상한 값이 나타납니다. 순서가 뒤 바뀌는 것도 같구요.
: :
: : 그리고 Count만큼 읽어서 보면 데이타가 실제로는 들어오지 않은 경우도 있습니다.
: : 만약 수신 버퍼를 0xaa으로 초기화 한뒤 Count만큼 버퍼를 읽어 수신버퍼에 쌓고 보면
: : 수신 버퍼에는 기존 초기값 0xaa만 저장되 있습니다.
: :
: : 혹시 같은 경우 보신분 계시면 조언 부탁드립니다.
: : 소스는 아래와 같습니다.
: : < Databit : 8 / Stopbit : 1 / Parity : None / 38400bps / Flow Control : None >
: :
: : void __fastcall TfrmMain::ComPort1RxChar(TObject *Sender, int Count)
: : {
: : unsigned char Buff[1024] = "";
: : AnsiString s, temp;
: :
: : memset(Buff, 0xaa, 1024); // 버퍼 초기화
: : ComPort1->Read(Buff,Count); // 버퍼에 Count만큼 읽어서 저장
: :
: : for(int i=0;i<Count;i++){ // temp 변수에 데이타 정리
: : s.sprintf("%02x",Buff[i]);
: : temp = temp + " " + s;
: : }
: : // 로깅
: : }
: :
: :
|