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);

这里的要点是它接收一个字节并将其十六进制值打印到 LCD 屏幕。理论上,这应该没有问题。波特率为9600,无奇偶校验,没有什么异常。在 Windows 上我使用 putty,在 Linux 上我使用 screen 。两者的设置相同。

然而,在 Windows 上我收到的字符十六进制值是 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 操作系统”主题相关。

更新

使用python -c 'print("a")' > /dev/ttyUSB0确实有效 - 板接收与字符相对应的字节,但无论我发送什么,都会在大写和小写之间交替。例如,打印a将收到 0x61,但c会收到 0x43(ascii 值中的大写 C)。它还忽略输入 - 打印aA始终调用 0x61

相关内容