Windows UART와 Linux UART의 올바른 구성 차이

Windows UART와 Linux UART의 올바른 구성 차이

핵심 문제: *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 이지만 aLinux에서는 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작동합니다. 보드는 문자에 해당하는 바이트를 받지만 내가 보내는 것은 무엇이든 대문자와 소문자를 번갈아 가며 나타납니다. 예를 들어 인쇄는 a0x61을 수신하지만 c0x43(ASCII 값의 대문자 C)은 수신됩니다. 또한 입력을 무시합니다. 0x61을 인쇄 a하거나 A항상 호출합니다.

관련 정보