개발 보드가 있고 Ubuntu 호스트에 연결하면 3개의 ACM 인터페이스가 있으며 ttyACM3을 통해 호스트에서 장치로 데이터를 전송하려고 합니다.
데이터 전송을 위해 다음 절차를 따랐습니다.
전제:
/etc/inittab
Linux 콘솔을 제거하도록 수정/dev/ttyGS3
- 최소 길이가 약 20MBytes인 바이너리 파일을 생성합니다.
테스트 단계:
- 테스트 측 장치:
stty -F /dev/ttyGS3 raw -echo -echoe -echok -echoctl -echoke
- 호스트 측:
stty -F /dev/ttyACM3 raw -echo -echoe -echok -echoctl -echoke
- 테스트 측 장치:
cat /dev/ttyGS3 > /tmp/rx_pattern.bin
- 호스트 측:
cat ./pattern.bin > /dev/ttyACM3
위 과정을 수행하면서 DUT 측에서 일부 데이터(~300KB)가 무작위로 손실되는 것을 발견했습니다. 또한 데이터 전송에 "dd" 명령을 사용했지만 여전히 데이터 손실이 있습니다.
그러나 "minicom" 애플리케이션과 "cat" 명령을 사용하여 호스트에서 동일한 "pattern.bin" 파일을 전송하여 DUT 측에서 수신하려고 시도했지만 놀랍게도 데이터 손실이 전혀 발생하지 않았습니다.
문제 시나리오에 USB Ellisys 로그가 있습니다.
"OUT" 트랜잭션 중 하나가 실패했고(핸드셰이크는 NAK임) 실패한 전송에는 "PING" 트랜잭션이 없었습니다.
성공 시나리오에서는 "OUT" 트랜잭션이 실패하는 한 "PING" 트랜잭션이 발생하고 데이터가 다시 전송됩니다.
stty
두 호스트의 명령 차이점
우분투 14.04:
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^A; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; 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
우분투 16.04:
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar 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 -flusho -extproc
놀랍게도 Minicom 애플리케이션에서 ACM3 포트를 열어두고 데이터를 보내려고 하면 Ubuntu 14.4에서도 데이터 손실이 없습니다.