핵심 문제: *nix의 UART 연결은 Windows의 UART 연결과 어떻게 다릅니까? 올바른 데이터 전송 및 수신을 위해 어떤 설정을 고려해야 합니까?
이 질문을 하게 된 배경: 이 질문은 내 다른 질문과 관련이 있습니다.전기 공학장소. 기본적으로 Ubuntu 랩톱과 마이크로 컨트롤러 사이에 직렬(USB-RS-232) 연결이 있으며 마지막 4비트는 올바르게 수신되지만 처음 4비트는 수신되지 않습니다. Windows에서는 8비트를 모두 수신합니다. 가능한 문제는 무엇입니까? 무엇보다 내가 관심을 갖고 있는 것은Windows UART와 Linux UART의 차이점
사양:
main
내가 사용하고 있는 마이크로 컨트롤러(PIC 18F87J11)에는 매우 간단한 코드가 있습니다.
while (1) {
while (!PIR1bits.RC1IF); //Wait for a byte
sprintf(txStr,"%.5X",RCREG);
LCDWriteLine(txStr,0);
여기서 중요한 점은 바이트를 수신하여 16진수 값을 LCD 화면에 인쇄한다는 것입니다. 이론적으로는 문제가 되지 않습니다. 전송 속도는 9600이며 패리티도 없고 특이한 것도 없습니다. Windows에서는 putty를 사용하고 Linux에서는 screen을 사용합니다. 둘 다의 설정은 동일합니다.
그러나 Windows에서는 받은 문자 16진수 값이 0x61 이지만 a
Linux에서는 0xE1
마지막 4비트가 올바르게 수신되고 처음 4비트는 올바르지 않습니다. 누군가 Linux가 비트 7을 설정했을 수 있다고 지적했는데, 이는 체크아웃된 것 같습니다.
$ echo "ibase=16;obase=2;E" | bc
1110
$ echo "ibase=16;obase=2;6" | bc
110
출력 stty
:
$ stty -F /dev/ttyUSB0 -a
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2;
-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
내 질문의 핵심으로 돌아가서:Windows UART와 Linux UART 연결의 차이점은 무엇입니까? 이론적으로는 동일해야 하지만 그렇지 않습니다! 작동하려면 어떤 설정을 변경해야 합니까?
문제 해결의 주제별 성격: 제가 댓글과 댓글에서 말했듯이/개발자/채팅, 질문은 특정 질문을 하고 범위 내에 유지됩니다.
- "*nix 데스크탑 또는 서버 사용 또는 관리"
- "UNIX C API와시스템 인터페이스"
- Raspberry Pi에서도 이것을 테스트했기 때문에 "임베디드 시스템의 기본 *nix OS" 주제와 관련이 있습니다.
고쳐 쓰다
사용하면 python -c 'print("a")' > /dev/ttyUSB0
작동합니다. 보드는 문자에 해당하는 바이트를 받지만 내가 보내는 것은 무엇이든 대문자와 소문자를 번갈아 가며 나타납니다. 예를 들어 인쇄는 a
0x61을 수신하지만 c
0x43(ASCII 값의 대문자 C)은 수신됩니다. 또한 입력을 무시합니다. 0x61을 인쇄 a
하거나 A
항상 호출합니다.