바이너리 모드 시리얼 통신?
글쓴이: mooore / 작성시간: 일, 2004/10/03 - 10:07오후
제목과 같은 말이 있는 진 모르겠습니다.
여지껏 시리얼 통신으로 주고 받은 데이터는 보통 문자열이거나 문자였기 때문에 별 문제가 없었습니다.
상황은 다음과 같습니다.
두개의 머신이 있고 이 머신은 시리얼을 통해서 연결되어 있습니다.
문자열을 주고 받는 것은 이상없이 잘 되고 있습니다.
(즉, 시리얼 통신에 필요한 하드웨어적인 문제는 없다는 뜻입니다.)
문제는 일반 정수형이나 double형 같은 것들을 문자열로 바꾸지 않고 바로 통신하게 하고 싶은데 잘 안되는군요.
즉, 한 머신에서 int형으로 선언된 변수를 write나 fwrite를 이용해서 시리얼 포트에 쓰면 다른 머신에서는 이를 read나 fread를 이용해서 받아 그냥 화면에 뿌려주고 싶습니다.
pseudo code of A machine(write)
int d = 10; double e = 12.34; write(serial_fd, &d, sizeof(d)); write(serial_fd, &e, sizeof(e));
pseudo code of B machine(read)
int d; double e; read(serial_fd, &d, sizeof(d)); read(serial_fd, &e, sizeof(e)); printf("%d, %g\n", d, e);
이런게 가능한 지, 또 가능하다면 어떤 다른 설정이 필요한 건지 알고 싶습니다.
Forums:
가능합니다. 다만 endian 이 같은것끼리의 통신에서 가능합니다.
가능합니다. 다만 endian 이 같은것끼리의 통신에서 가능합니다.
---
http://coolengineer.com
답변 감사드립니다.엔디안이 다르면 불가능한건가요?현재 두 머신
답변 감사드립니다.
엔디안이 다르면 불가능한건가요?
현재 두 머신의 엔디안이 다른 상태라서요.
한쪽 머신에서 엔디안을 강제로 맞추면 되지 않을런지 모르겠습니다.
(강제라는 의미는 루틴적으로 맞춘 후 시리얼 포트로 보내겠다는 의미입니다.)
그리고 엔디안이 같으면 가능하다고 하셨는데 죄송하지만 어떻게 작성되어야 하는지 알려주실 수 있는지요?
일반적으로 사용하는 canonical mode나 non-canonical mode로 가능한건지 아니면 다른 게 필요한 건지 궁금합니다.
별은 바라보는 자에게 빛을 준다.
[quote="mooore"]엔디안이 다르면 불가능한건가요?현재 두
됩니다.
endian을 반드시 맞추세요.
지금까지 했던(문자열전송시 8bit data 세팅 필요; N81이면 되겠지요?) 방법이면 됩니다.
escape sequence(termial 제어코드등)가 무시되어야 하므로, non-canonical mode가 되어야 겠네요.
* 아니면, 바이트전송량 및 변환에서 오버헤드는 다소 증가되지만, BASE64등으로
인코딩해서 송신하고 수신 후 디코딩하는것도 방법은 되겠습니다. (SMTP가 이렇게 합니다.)
[quote="Anonymous"][quote="mooore"]엔디안이
상세한 답변 감사드립니다. :-)
별은 바라보는 자에게 빛을 준다.
시리얼 통신 읽고 쓰기 (바이트 통신)
시리얼 통신에는 바이너리 통신과 아스키 통신으로 나누어 집니다.
1. 아스키 통신의 경우
그냥 printf("%s\r\n", buf);
하면 볼수 있지요.
하지만 바이너리인 경우는 화면에서 볼수가 없습니다.
이럴경우 핵사바이트형태로 화면에 디스플레이하면 됩니다.
여기서 버퍼는 꼭 unsigned 로 정의 하세요.
이렇게 하면 통신에서 받은 바이너리를 볼수가 있지요...
2. 그리고 통신시에 int , long int, float 등의 값을 그대로 전송하여 받고 싶으세요.
그러면 전송을 위한 부분에서
리눅스 int 4바이트
float 4바이트
보내는 쪽
...
받는 쪽
하면 값을 볼수 있지요...
코디의 맣은 부분을 생략 했습니다. 고민 하신 분이면 금방 알수 있을 것입니다.
도움이 도었으면 합니다.
http://home.webmon.co.kr
에 오시면 시리얼 관련 장비 많이 있습니다.
한번 들러 주세요.
http://home.webmon.co.kr/showroom/showroom.php
현재는 윈도우 웹브라우저만 지원합니다. JAVA버전으로 개선하겠습니다.
여기는 시리얼 통신과 TCP/IP로 구현한 인터넷 원격제어 데모 입니다.
한번 해보세요.
리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축
Re: 시리얼 통신 읽고 쓰기 (바이트 통신)
역시 상세한 답변 감사드립니다.
"손님" 말씀대로 해서 구현이 잘 되어서 감사 인사 드릴려고 왔는데 상세한 답변을 달아주셨군요.
결론적으로 제가 사용한 코드랑 말씀해주신 코드랑 거의 흡사하게 되었습니다. :-)
"손님"과 "GENIUS"님에게 진심으로 감사드립니다.
별은 바라보는 자에게 빛을 준다.
도움이 되었다니 저도 감사
도움이 되었다니 저도 감사드립니다.
시리얼 통신과 프로토콜 분석 TCP/IP구현 등의 질문은 언제든지 ...
해주셔도 됩니다.
리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축
댓글 달기