mik*_*ycz 5 linux serial-port uart
我正在尝试通过 COM 端口在单板计算机和 PC 之间进行通信。在单板计算机上,我运行的是 Debian Linux,有两个 UART 可供我使用。在其中一个 UART ( ttyS1 ) 上,我可以毫无问题地进行通信(发送和接收)。当我尝试在另一个 UART ( ttyS0 )上进行通信时,发送工作正常,但是接收丢失了第一个字节(向 PC 上的控制台发送一条错误消息,说输入的字符不是命令),然后所有正确接收未来的字符。
如果我从接收切换到发送,然后再切换回接收,也会发生同样的情况。如果我保持在接收模式,我可以在不丢失数据的情况下接收任意长的字符。从发送到接收的转换似乎导致了这种情况的发生。
正如我之前提到的,我在另一个 UART (ttyS1) 上没有看到这个问题。我开始寻找两个端口不同的原因。我使用相同的程序为两个 UARTS 设置发送和接收,因此问题不在程序设置中。当我输入命令时,我确实发现了一件事,我dmesg |grep tty得到以下信息:
[ 0.000000] Kernel command line: console=ttyS0,115200 root=/dev/mmcblk0p2 roo twait loglevel=8 panic=10
[ 0.446780] sunxi-uart.1: ttyS0 at MMIO 0x1c28400 (irq = 2) is a U6_16550A
[ 1.114996] console [ttyS0] enabled
[ 1.154643] sunxi-uart.3: ttyS1 at MMIO 0x1c28c00 (irq = 4) is a U6_16550A
Run Code Online (Sandbox Code Playgroud)
我看到 ttyS0 具有与之关联的“控制台 [ttyS0] 启用”,而 ttyS1 没有。我想知道“启用控制台 [ttyS0] 是什么意思?
另外,有没有办法禁用它以查看这是否是导致我的“第一个数据丢失字节”的原因?我在单板计算机的设置中看到 ttyS0 被指定为“调试端口”。
我还想知道这是否类似于控制台?
有人可以解释一下启用控制台意味着什么吗?
小智 5
控制台是内核日志所在的 tty。
您在启动时通过内核参数选择特定的一个,可以在您提供的日志中看到,在“Kernel command line: console=ttyS0,115200 root=/dev/mmcblk0p2 roo twait loglevel=8panic=10”行中
您可以选择另一个控制台(如果您的平台可用),这样 ttyS0 将不会在内核启动时获取任何字节。
我看到 ttyS0 具有与其关联的“控制台 [ttyS0] 已启用”,而 ttyS1 没有。我想知道“控制台 [ttyS0] 启用”是什么意思?
我认为这是因为unix的历史。最初,正如该邮件中对此进行了很好的解释,有两种串行端口:/dev/tty*和/dev/cu*.长话短说,一种tty用于通过串行端口的传入连接,一种cu用于通过串行端口的传出连接。另一端是 UNIX 控制台,即串行终端。
由于您的单板计算机通过串行端口使用控制台进行通信,并且没有“真正的”控制台(我的意思是显示器和键盘)将控制台绑定为伪tty(/dev/tty),因此您的可能/dev/ttyS0是确实被内核用作输入和输出的控制台,耐心等待终端连接并断言DTR线。但从那时起,你就开始发送数据,而不遵守 40 年前的协议。
为了解决您的情况,您很可能需要更改引导加载程序中的内核引导行,以便更改console=/dev/ttyS0. 您可能还想查看/dev/inittab并检查线路getty。
| 归档时间: |
|
| 查看次数: |
13911 次 |
| 最近记录: |