.

tweedledum의 이미지
tweedledum의 이미지

두 컴의 serial 특성을 똑같이 맞춰줬습니다. 시리얼 포트가 있는 컴에선 잘 동작합니다.

    attr.c_iflag = IGNPAR;
    attr.c_oflag = 0;
 
    attr.c_cflag = B9600 | CRTSCTS | CS8 | CSTOPB | \
                                         PARENB | PARODD | CREAD | CLOCAL;
 
    attr.c_lflag = 0;
 
    attr.c_cc[VINTR]    = 0;     /* Ctrl-c */ 
    attr.c_cc[VQUIT]    = 0;     /* Ctrl-\ */
    attr.c_cc[VERASE]   = 0;     /* del */
    attr.c_cc[VKILL]    = 0;     /* @ */
    attr.c_cc[VEOF]     = 4;     /* Ctrl-d */
    attr.c_cc[VTIME]    = 0;     /* inter-character timer unused */
    attr.c_cc[VMIN]     = 1;     /* blocking read until 1 character arrives */
    attr.c_cc[VSWTC]    = 0;     /* '\0' */
    attr.c_cc[VSTART]   = 0;     /* Ctrl-q */ 
    attr.c_cc[VSTOP]    = 0;     /* Ctrl-s */
    attr.c_cc[VSUSP]    = 0;     /* Ctrl-z */
    attr.c_cc[VEOL]     = 0;     /* '\0' */
    attr.c_cc[VREPRINT] = 0;     /* Ctrl-r */
    attr.c_cc[VDISCARD] = 0;     /* Ctrl-u */
    attr.c_cc[VWERASE]  = 0;     /* Ctrl-w */
    attr.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
    attr.c_cc[VEOL2]    = 0;     /* '\0' */
    tcflush(fd, TCIFLUSH);
 
    if(tcsetattr(fd, TCSANOW, &attr) < 0) {
        return -1;
    }

# stty -a -F /dev/ttyUSB0
speed 9600 baud; rows 0; columns 0; line = 0;
intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = ^D;
eol = <undef>; eol2 = <undef>; swtch = <undef>; start = <undef>; stop = <undef>;
susp = <undef>; rprnt = <undef>; werase = <undef>; lnext = <undef>;
flush = <undef>; min = 1; time = 0;
parenb parodd cs8 -hupcl cstopb cread clocal crtscts
-ignbrk -brkint -ignpar -parmrk inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt
-echoctl -echoke
 
 
# stty -a -F /dev/ttyS0
speed 9600 baud; rows 0; columns 0; line = 0;
intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = ^D;
eol = <undef>; eol2 = <undef>; swtch = <undef>; start = <undef>; stop = <undef>;
susp = <undef>; rprnt = <undef>; werase = <undef>; lnext = <undef>;
flush = <undef>; min = 1; time = 0;
parenb parodd cs8 -hupcl cstopb cread clocal crtscts
-ignbrk -brkint -ignpar -parmrk inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt
-echoctl -echoke

안됩니다. ㅠㅠ

% ls -l /dev/ttyS0
crw-rw---- 1 root dialout 4, 64 10# 4 23:46 /dev/ttyS0
% groups
users lp dialout audio video cdrom iguanair apache scanner

$ ls -l /dev/ttyUSB0
crw-rw-rw- 1 root dialout 188, 0 Oct 4 23:51 /dev/ttyUSB0
$ groups
users dialout audio video cdrom

이제 널 모뎀 젠더나 케이블을 구입해서 컴 두대를 연결한 다음 USB-serial adapter 동작을 확인해봐야 할 것 같습니다.

tweedledum의 이미지

.

tweedledum의 이미지

.

익명 사용자의 이미지

쓰레기 값이 출력되어 나오네요.

USB-serial adapter 를 NULL modem 과 연결해서 사용했습니다. 그리고 두 대의 컴을 이용해서 테스트해본 결과. 컴퓨터 초기 세팅을 그대로 이용했습니다. 두 컴의 시리얼 특성이 같더군요.

NULL modem 케이블을 통해서 USB-serial adaptor 로 전달되는 값은 이상이 없는데. USB-serial adaptor 에서 NULL modem으로 전달되는 값에 문제가 있네요.

kyle@chilli:~$ echo zzz > /dev/ttyUSB0
kyle@chilli:~$ echo zzzaaaaaaaaaaaaaa > /dev/ttyUSB0
kyle@chilli:~$ echo zzzaaaaaaaaaaaaaa > /dev/ttyUSB0

kyle@tangled:~\% cat /dev/ttyS0
^@abc^M^M^M^M^M^M^M^M^M^M^J^M^J^zzz
^@abc^M^M^M^M^M^M^M^M^M^M^J^M^J^zzzaaaaaaaaaaaaaa
^@abc^M^M^M^M^M^M^M^M^M^M^J^M^J^zzzaaaaaaaaaaaaaa

앞에 ^ 붙은 문자들은 컨트롤 문자로 보입니다. ^M 은 CR/LF 관련 문자구요. 앞에 쓰레기 값이 preamble 처럼 딱 달라 붙어 있네요.

이 문제를 디버깅하기 보다는 새로운 케이블을 사야할 것 같습니다.

인터넷에 보니 CH340, CH341 USB serial adapter를 사지 마라는 글이 있네요.

http://www.ebay.com/gds/Usb-to-serial-adapters-Beware-read-before-buying-/10000000011225604/g.html

mirheekl의 이미지


저가형으로 많이 제작되는데 특성상 타이밍적으로 어긋나거나 PC에서 사용하는 칩에 비해 멋대로 버퍼링을 더 해버리든지 일부 설정을 무시하는 등의 일이 많이 일어납니다.

PC환경이라면 USB용을 사용하지 마시고 PCI나 PCI 익스프레스용 시리얼 카드를 사용해보심이 어떨까 합니다.

노트북용도 USB말고 익스프레스포트라든지 기타등등 좀더 신뢰성있는 버스를 사용하는 제품들이 많이 나와 있습니다.

문제는 가격이지만요.. 하긴 비싼만큼 사용자 지원이 충실한 장점은 있지만..

가격차이가 워낙 많이 나니 그냥 USB 시리얼을 여러개 사서 그중에 잘 동작되는걸 쓰는게 더 쌀지도 모르겠네요.

--

익명 사용자의 이미지

가격의 문제가 아니라도 serial 포트 사용하자고 PCI 보드를 사는 것은 좀 그렇네요. 신뢰성이 중요한 통신이라면 필요하겠지만요. 제 경우에는 그 정도는 아닙니다. ㅎㅎ

자주 쓰지 않는 단순한 디바이스의 경우에 저는 USB를 선호합니다. 속도가 문제가 되는 경우에도 PCI가 더 낫겠죠.

익명 사용자의 이미지

이상한 점을 하나 발견했습니다.

ch341 윈도우즈 드라이버로 테스트를 해보았습니다. win 7 virtual machine <-> linux machine 이렇게요. 물론 usb-serial adpator와 null modem cable로 연결을 했습니다. 그런데 올바르게 동작을 하였습니다.

그래서 다시 리눅스에서 usbserial.c, ch341.c 파일을 모듈로 만들어서 디버깅을 해보았죠. 그랬더니 adapter 전에... usbserial.c 그러니까... 리눅스 커널에서 이상한 행동을 하는 것으로 보였습니다.

USB 전체를 디버깅하는 것은 일을 너무 벌이는 것 같기도 하고. 별로 자신도 없어서 보류하고 있습니다.

현재로서는 linux kernel 에서 ch341 칩을 잘 다루지 못하고 있다고 보여집니다.

그리고 pl2303(숫자가 맞나 모르겠네요) chip 을 쓰는 usb-serial adaptor를 새로 주문하였습니다. 이것마저 동작이 이상하면 디버깅을 시도해보는 수밖에 없겠죠.

익명 사용자의 이미지

PC 대 PC 테스트 결과는 좋은데 제가 정작 사용하려는 디바이스가 문제가 되네요. 설정의 문제일 가능성도 완전히 배제하진 못하겠지만. 그럴 가능성은 한국 대통령이 골프장에서 골프를 치다가 번개를 맞고 사망할 확률과 비슷하다고 생각됩니다.

CH341은 드라이버도 문제가 있는 것 같지만 하드웨어 문제가 심각한 것으로 보여집니다.

아... 요새 골치가 아픕니다. 이렇게 쓰레기 제품을 만들어 파는 xx들을 생각하니 열불이 나네요. 소중한 자원을 가져다가 쓰레기를 만들어서 돈을 받다니. 이런 제품들을 사는 사람들은 제품을 사서 안되면 그냥 쓰레기통으로 가겠지요. 파는 사람 입장에선 이런게 '창조 경제'일 수도 있겠네요.

익명 사용자의 이미지

예전에 아두이노 보드에서 사용했던 기억이 납니다. 인터넷에서도 상대적으로 평이 괜찮네요.

이것을 테스트해보기로 하겠습니다.

익명 사용자의 이미지

안녕하세요. 저도 이 문제로 검색하다가 같은 증상을 겪으시는 분을 만나네요. (검색어 자체도 뭐라고 해야 될지 모르겠더라구요)

프로그램 가지고도 아니고 간단하게 cutecom 가지고 hex 데이터 보내는데 usb 가 말썽입니다.

환경은 보드에 달린 시리얼포트 1개와 FT232 usb시리얼 어댑터 입니다.

자세한 구성은 아래와 같습니다.

send/receive
lubuntu 12.10 (cutecom) <---------------------> centos 6.4 (cutecom)
(ttyS0) (ttyUSB0)

ttyUSB0 에서 send 하는 메시지는 ttyS0 가 잘 받는데, receive 는 처음에 한번정도만 들어오고

그 뒤로는 계속 에러가 납니다. ttyS0 쪽에 쓰레기 값이 찍힌다던가 보내는 값이 짤려서 다시 돌아온다던가요.

USB 쪽은 한두번 그러다가 연결이 끊겨버리네요.

어댑터를 다른거로 바꾸어서 해보아도 같은 문제고, Centos 쪽이 드라이버가 잘 맞지 않는 모양입니다.

윈도우즈에서 테스트 했을 때는 글쓴 분과 같은 결과가 나와요. 받기/보내기 잘됩니다.

둘다 윈도우가 아니라 Centos 쪽에서 가상OS 로 돌린 윈도우인데도 말이죠.

(ttyS0 쪽은 루분투고 USB 쪽은 가상 윈도우XP 로 테스트)

윈도우가 잘되는 것으로보아 드라이버가 문제인 듯한데 2달전에 쓰신 포스트인데

해결보셨는지 궁금합니다.

mirheekl의 이미지

USB 시리얼을 제조하는 회사가 워낙 여러곳인데, 개중에 영세한 업체도 있어서 리눅스 드라이버에까지 제대로 신경을 못쓰는 경우가 허다합니다.

칩셋회사와 제품 패키징 회사가 서로 달라서 드라이버 디버깅을 요구해도 서로 핑퐁치다 끝나기도 하고요. (드라이버는 칩셋 회사에서 개발했으니 그쪽에 문의해봐라 -> 넌 그냥 엔드유저일뿐이니 칩셋회사인 우린 지원의무없다 무한루프)

바로 그런 이유때문에 그냥 검증된 업체의 제품을 사용하는 게 낫다는 조언을 드린 것이었습니다. (특히, 꼭 필요하지 않을 경우 USB를 피하라는 얘기도 같은 맥락입니다. USB는 OEM이 워낙 많아서..)

고작 시리얼 포트 하나 사자고 몇 만원 이상 하는 산업용 제품을 사는 건 일견 낭비로 보일지 모르나 문제 생겨서 자기 잘못도 아닌 것을 디버깅하느라 며칠 날리는걸 감안하면 훨씬 나은 선택입니다. 전문업체의 제품은 사용자지원도 받을 수 있고 말이죠.

--

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.