바이너리 모드 시리얼 통신?

mooore의 이미지

제목과 같은 말이 있는 진 모르겠습니다.
여지껏 시리얼 통신으로 주고 받은 데이터는 보통 문자열이거나 문자였기 때문에 별 문제가 없었습니다.
상황은 다음과 같습니다.

두개의 머신이 있고 이 머신은 시리얼을 통해서 연결되어 있습니다.
문자열을 주고 받는 것은 이상없이 잘 되고 있습니다.
(즉, 시리얼 통신에 필요한 하드웨어적인 문제는 없다는 뜻입니다.)

문제는 일반 정수형이나 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);

이런게 가능한 지, 또 가능하다면 어떤 다른 설정이 필요한 건지 알고 싶습니다.

pynoos의 이미지

가능합니다. 다만 endian 이 같은것끼리의 통신에서 가능합니다.

mooore의 이미지

답변 감사드립니다.

엔디안이 다르면 불가능한건가요?
현재 두 머신의 엔디안이 다른 상태라서요.
한쪽 머신에서 엔디안을 강제로 맞추면 되지 않을런지 모르겠습니다.
(강제라는 의미는 루틴적으로 맞춘 후 시리얼 포트로 보내겠다는 의미입니다.)

그리고 엔디안이 같으면 가능하다고 하셨는데 죄송하지만 어떻게 작성되어야 하는지 알려주실 수 있는지요?
일반적으로 사용하는 canonical mode나 non-canonical mode로 가능한건지 아니면 다른 게 필요한 건지 궁금합니다.

별은 바라보는 자에게 빛을 준다.

익명 사용자의 이미지

mooore wrote:
엔디안이 다르면 불가능한건가요?
현재 두 머신의 엔디안이 다른 상태라서요.
한쪽 머신에서 엔디안을 강제로 맞추면 되지 않을런지 모르겠습니다.
(강제라는 의미는 루틴적으로 맞춘 후 시리얼 포트로 보내겠다는 의미입니다.)

됩니다.
endian을 반드시 맞추세요.
mooore wrote:

그리고 엔디안이 같으면 가능하다고 하셨는데 죄송하지만 어떻게 작성되어야 하는지 알려주실 수 있는지요?

지금까지 했던(문자열전송시 8bit data 세팅 필요; N81이면 되겠지요?) 방법이면 됩니다.
escape sequence(termial 제어코드등)가 무시되어야 하므로, non-canonical mode가 되어야 겠네요.

* 아니면, 바이트전송량 및 변환에서 오버헤드는 다소 증가되지만, BASE64등으로
인코딩해서 송신하고 수신 후 디코딩하는것도 방법은 되겠습니다. (SMTP가 이렇게 합니다.)

mooore의 이미지

Anonymous wrote:
mooore wrote:
엔디안이 다르면 불가능한건가요?
현재 두 머신의 엔디안이 다른 상태라서요.
한쪽 머신에서 엔디안을 강제로 맞추면 되지 않을런지 모르겠습니다.
(강제라는 의미는 루틴적으로 맞춘 후 시리얼 포트로 보내겠다는 의미입니다.)

됩니다.
endian을 반드시 맞추세요.
mooore wrote:

그리고 엔디안이 같으면 가능하다고 하셨는데 죄송하지만 어떻게 작성되어야 하는지 알려주실 수 있는지요?

지금까지 했던(문자열전송시 8bit data 세팅 필요; N81이면 되겠지요?) 방법이면 됩니다.
escape sequence(termial 제어코드등)가 무시되어야 하므로, non-canonical mode가 되어야 겠네요.

* 아니면, 바이트전송량 및 변환에서 오버헤드는 다소 증가되지만, BASE64등으로
인코딩해서 송신하고 수신 후 디코딩하는것도 방법은 되겠습니다. (SMTP가 이렇게 합니다.)

상세한 답변 감사드립니다. :-)

별은 바라보는 자에게 빛을 준다.

GENIUS의 이미지

시리얼 통신에는 바이너리 통신과 아스키 통신으로 나누어 집니다.

1. 아스키 통신의 경우
그냥 printf("%s\r\n", buf);

하면 볼수 있지요.

하지만 바이너리인 경우는 화면에서 볼수가 없습니다.
이럴경우 핵사바이트형태로 화면에 디스플레이하면 됩니다.

unsigned char buf[100];


for(i=0;i< N;i++)
printf("%02X",buf[i);
printf("\r\n");

여기서 버퍼는 꼭 unsigned 로 정의 하세요.

이렇게 하면 통신에서 받은 바이너리를 볼수가 있지요...

2. 그리고 통신시에 int , long int, float 등의 값을 그대로 전송하여 받고 싶으세요.

그러면 전송을 위한 부분에서

리눅스 int 4바이트
float 4바이트

보내는 쪽

int  ivalue;

unsigned char buf[100];


buf[0]=((unsigned char*)(&ivalue))[0];
buf[1]=((unsigned char*)(&ivalue))[1];
buf[2]= ((unsigned char*)(&ivalue))[2];
buf[3]= ((unsigned char*)(&ivalue))[3];


write(fd,buf,....);

...

받는 쪽

read(fd,buf)


((unsigned char*)(&ivalue))[0]=buf[0];
((unsigned char*)(&ivalue))[1]=buf[1];
((unsigned char*)(&ivalue))[2]=buf[2];
((unsigned char*)(&ivalue))[3]=buf[3];


printf("%d\r\n",ivalue);

하면 값을 볼수 있지요...

코디의 맣은 부분을 생략 했습니다. 고민 하신 분이면 금방 알수 있을 것입니다.
도움이 도었으면 합니다.

http://home.webmon.co.kr

에 오시면 시리얼 관련 장비 많이 있습니다.

한번 들러 주세요.

http://home.webmon.co.kr/showroom/showroom.php
현재는 윈도우 웹브라우저만 지원합니다. JAVA버전으로 개선하겠습니다.

여기는 시리얼 통신과 TCP/IP로 구현한 인터넷 원격제어 데모 입니다.

한번 해보세요.

리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축

mooore의 이미지

GENIUS wrote:
시리얼 통신에는 바이너리 통신과 아스키 통신으로 나누어 집니다.

1. 아스키 통신의 경우
그냥 printf("%s\r\n", buf);

하면 볼수 있지요.

하지만 바이너리인 경우는 화면에서 볼수가 없습니다.
이럴경우 핵사바이트형태로 화면에 디스플레이하면 됩니다.

unsigned char buf[100];


for(i=0;i< N;i++)
printf("%02X",buf[i);
printf("\r\n");

여기서 버퍼는 꼭 unsigned 로 정의 하세요.

이렇게 하면 통신에서 받은 바이너리를 볼수가 있지요...

2. 그리고 통신시에 int , long int, float 등의 값을 그대로 전송하여 받고 싶으세요.

그러면 전송을 위한 부분에서

리눅스 int 4바이트
float 4바이트

보내는 쪽

int  ivalue;

unsigned char buf[100];


buf[0]=((unsigned char*)(&ivalue))[0];
buf[1]=((unsigned char*)(&ivalue))[1];
buf[2]= ((unsigned char*)(&ivalue))[2];
buf[3]= ((unsigned char*)(&ivalue))[3];


write(fd,buf,....);

...

받는 쪽

read(fd,buf)


((unsigned char*)(&ivalue))[0]=buf[0];
((unsigned char*)(&ivalue))[1]=buf[1];
((unsigned char*)(&ivalue))[2]=buf[2];
((unsigned char*)(&ivalue))[3]=buf[3];


printf("%d\r\n",ivalue);

하면 값을 볼수 있지요...

코디의 맣은 부분을 생략 했습니다. 고민 하신 분이면 금방 알수 있을 것입니다.
도움이 도었으면 합니다.

http://home.webmon.co.kr

에 오시면 시리얼 관련 장비 많이 있습니다.

한번 들러 주세요.

http://home.webmon.co.kr/showroom/showroom.php
현재는 윈도우 웹브라우저만 지원합니다. JAVA버전으로 개선하겠습니다.

여기는 시리얼 통신과 TCP/IP로 구현한 인터넷 원격제어 데모 입니다.

한번 해보세요.

역시 상세한 답변 감사드립니다.
"손님" 말씀대로 해서 구현이 잘 되어서 감사 인사 드릴려고 왔는데 상세한 답변을 달아주셨군요.
결론적으로 제가 사용한 코드랑 말씀해주신 코드랑 거의 흡사하게 되었습니다. :-)

"손님"과 "GENIUS"님에게 진심으로 감사드립니다.

별은 바라보는 자에게 빛을 준다.

GENIUS의 이미지

도움이 되었다니 저도 감사드립니다.

시리얼 통신과 프로토콜 분석 TCP/IP구현 등의 질문은 언제든지 ...

해주셔도 됩니다.

리눅스 네트웍 개발 (FA) /유비쿼터스 네트웍 하드웨어 개발 프로젝트 진행/인터넷을 통한 원격제어/
리눅스 베이스 FA 구현/초소형 무선랜 모듈개발 진행중/리눅스 웹 통합시스템 구축

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.