C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[71222] Re:Re: RS232C는 RS422과는 달리 Differential 방식이 아닙니다
pwrlove [pwrlove] 2159 읽음    2014-04-15 17:30
우연히 지나다 혹시 도움이 될까해서...,

아주 오랜 옛날에 같은 문제로 고생했던 기억이 있어서...
보레이트와 전송라인 길이는 상관관계가 좀 있는데요.

보레이트가 올라가면 라인 길이에 영향을 주게 됩니다. 뭐, 기술자료에 보면 임피던스가 증가한다고 되어 있는데...
속도가 올라가면 급격히 유효한 거리가 짧아지게 됩니다. 이말은 잘 될 수도 있지만, 환경에 따라 노이즈의 영향이 커지고,
최악의 경우는 전혀 안될 수도 있다는 거죠.

그래서, RS-422. 485 이런 방식을 쓰는데, 기술적으로 1.2Km까지 전송이 가능하다고 되어 있지만, 이역시도
보레이트를 높이면 불안정해지는 경우가 생깁니다.

이런경우, 하드웨어적인 부분 뿐만아니라, 소프트웨어적인 부분으로도, 충분히 보강을 해서 언제나 정확한 데이터를
송수신할 수 있도록 보장을 해 줘야 합니다. (CRC 체크를 많이 사용합니다.)
케이블을 비싼거 쓰시면 좀 전송 거리가 길어질 수 있지만, 개인적으로 사용할 1~2개 취미용품 아니고, 상용이면,
가성비 고려하셔야 하고, 돈만 신경쓸일 아니면 뭐든 상관 있겠습니까? 광통신도 가능할테고....,

하드웨어는 속도보다 정확성이 중요하면 보레이트를 가급적 낮추서 전송합니다. 결국 어떤게 중요한지에 따라 trade-off
하시는 겁니다.

RS232는 수십미터 이상이면 에러가 많이 생길 수 있으니 RS-485를 찾아 보시고, 사용가능한 chip (옛날에는 SN 75176인가?)
이거 많이 썼는데요. 요즘은 잘 모르겠네요.

기술자료 같은 거 검색해 보시면 아래 분이 말씀하신 내용, 보레이트 대 전송거리 관계등 많은 자료가 있습니다.

도움되시길 바랍니다.


지나다가 님이 쓰신 글 :
: 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;
: : :     }
: : :                 // 로깅
: : : }
: : :
: : :

+ -

관련 글 리스트
69544 CPort 컴포넌트로 볼레이트 38400는 힘든가요? newhuni 2179 2013/05/28
69572     Re:CPort 컴포넌트로 볼레이트 38400는 힘든가요? 보리 2171 2013/05/30
69549     Re:CPort 컴포넌트로 볼레이트 38400는 힘든가요? 라스코니 2155 2013/05/28
69546     Re:CPort 컴포넌트로 볼레이트 38400는 힘든가요? 햄머 2884 2013/05/28
69545     Re:CPort 컴포넌트로 볼레이트 38400는 힘든가요? 김태선 2212 2013/05/28
69547         Re: RS232C는 RS422과는 달리 Differential 방식이 아닙니다 지나다가 2435 2013/05/28
71222             Re:Re: RS232C는 RS422과는 달리 Differential 방식이 아닙니다 pwrlove 2159 2014/04/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.