我正在尝试通过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
我看到ttyS0的“console [ttyS0]已启用”与ttyS1没有关联。我想知道“控制台[ttyS0]启用了什么意思?
此外,有没有办法禁用它,看看这是否是导致我的“数据丢失的第一个字节”?我在单板计算机的设置中看到ttyS0被指定为“调试端口”。
我还想知道这是否类似于控制台?
有人可以解释启用控制台的含义吗?
答案 0 :(得分:1)
控制台是内核日志所在的tty。
您在引导时通过内核参数选择特定的参数,可以在您提供的日志中看到,在行"内核命令行中: console = ttyS0,115200 root = / dev / mmcblk0p2 roo twait loglevel = 8 panic = 10"
您可以选择另一个控制台(如果您的平台可用),以便ttyS0在内核启动时不会获得任何字节。
答案 1 :(得分:-2)
我看到ttyS0的“console [ttyS0]已启用”与ttyS1没有关联。我想知道“控制台[ttyS0]启用了什么意思?
我认为这是因为unix的历史。最初,正如in that mail所解释的那样,有两种串口:/dev/tty*
和/dev/cu*.
长话短说明,tty
表示通过串行端口传入连接,cu
连接通过串行端口进行传出连接。而在另一端,有unix控制台,串行终端。
由于您的单板计算机通过串行端口使用控制台进行通信,并且没有“真正的”控制台(我的意思是显示器和键盘)将控制台绑定为伪 tty (< em> / dev / tty ),很有可能你的/dev/ttyS0
确实被内核用作输入和输出的控制台,耐心等待终端连接并断言 DTR < / em>行。但是你开始发送数据而不尊重那个有40年历史的协议。
要解决您的情况,您可能需要更改引导加载程序中的内核引导行,以便更改console=/dev/ttyS0
。您可能还需要查看/dev/inittab
并查看getty
行。