用Linux连接两个串口

 雅芳07866 发布于 2023-01-11 17:05

我希望有一个人可以帮助我.我正在尝试在ARM中进行串行端口通信(我正在使用Linux).问题是我在Windows中使用称为终端的程序,我用它来查看输出.

我有两条电缆从我的ARM连接到我的电脑的USB.我所做的是打开两个终端程序窗口,然后我连接相应的串口,直到这里一切正常.

现在,在窗口中的一个我有ARM控制台(这是ttymxc1串行端口),其中余写例如"回波你好>的/ dev/ttymxc2"(该ttymxc2是在其他窗口的其他端口).当我执行它时,somenthing出现,somenthing如下:"<0> <0> <0> <0> <0> <0> <0>".我阅读,我发现它通常是波特率的问题,所以我改变"ttymxc2"的波特率为115200像"ttymxc1"都以相同的速度.一旦我这样做,我试图再次发送相同的回声,出现这个:<0>©::*ë<0>所以,somenthig正在改变.

我得到了两个串口的所有参数,它是输出:

stty -a -F /dev/ttymxc1    

speed 115200 baud;stty: /dev/ttymxc1
line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ^J;
eol2 = ; swtch = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
 -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     


stty -F /dev/ttymxc2 115200    

stty -a -F /dev/ttymxc2    

speed 115200 baud;stty: /dev/ttymxc2
line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ;
eol2 = ; swtch = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-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    

我不知道哪个参数可以更改,我在终端程序中使用115200 8n1两个窗口中没有握手配置.

当我执行这个时

setserial /dev/ttymxc2 -v autoconfig

/dev/ttymxc2, UART: undefined, Port: 0x0000, IRQ: 60

setserial /dev/ttymxc0 -v autoconfig

/dev/ttymxc0, UART: undefined, Port: 0x0000, IRQ: 58

所以我被调查了,而且我是红色的,我必须像这样设置somenthing:

setserial /dev/ttymxc2 uart 16550A

这是输出:

setserial: can't set serial info: Invalid argument

但我不确定这是不是问题,因为ttymxc1端口也是未定义的,我可以看到ARM输出非常好,所以我很失落,我希望有人可以帮助我.

我希望解释清楚

非常感谢你

输出dmesg | grep tty:

Kernel command line: noinitrd loglevel=7 no_console_suspend console=ttymxc1,115200 
fec_mac=00:05:51:07:B3:B5 mtdparts=gpmi-          nand:512k(NBoot)ro,2m(UBoot)ro,256k(UBootEnv),256k
(UserDef),6m(Kernel)ro,-(TargetFS) gpmi_debug_init enable_wait_mode=off   ubi.mtd=TargetFS root=ubi0:rootfs rootfstype=ubifs rootwait rw
bootconsole [ttymxc1] enabled
imx-uart.0: ttymxc0 at MMIO 0x2020000 (irq = 58) is a IMX
imx-uart.1: ttymxc1 at MMIO 0x21e8000 (irq = 59) is a IMX
console [ttymxc1] enabled, bootconsole disabled
imx-uart.2: ttymxc2 at MMIO 0x21ec000 (irq = 60) is a IMX

输出/ proc/tty/driver

/dev/tty             /dev/tty        5       0 system:/dev/tty
/dev/console         /dev/console    5       1 system:console
/dev/ptmx            /dev/ptmx       5       2 system
/dev/vc/0            /dev/vc/0       4       0 system:vtmaster
rfcomm               /dev/rfcomm   216 0-255 serial
IMX-uart             /dev/ttymxc   207 16-23 serial
pty_slave            /dev/pts      136 0-1048575 pty:slave
pty_master           /dev/ptm      128 0-1048575 pty:master
pty_slave            /dev/ttyp       3 0-255 pty:slave
pty_master           /dev/pty        2 0-255 pty:master
unknown              /dev/tty        4 1-63 console

我点击这个cat/proc/tty/driver/IMX-uart adn这是输出:

0: uart:IMX mmio:0x02020000 irq:58 tx:0 rx:0 DSR|CD
1: uart:IMX mmio:0x021E8000 irq:59 tx:12075 rx:358 RTS|DTR|DSR|CD
2: uart:IMX mmio:0x021EC000 irq:60 tx:0 rx:0 DSR|CD

sawdust.. 6

根据/ proc/tty/driver/IMX-uart测试的正面结果和收到的垃圾数据,假设ARM板上的Linux在发出shell命令时发送输出似乎是安全的echo hello > /dev/ttymxc2.我们知道您在主机PC和/ dev/ttymxc2(串行控制台)之间有一个良好的串行链接.

第Ia部分

通常,要检查的第一项是imx-uart.2在电路板上的连接器上的输出.您需要一台示波器,并且可以确认逻辑电平或RS-232电压似乎没问题.此检查还要确认您已使用正确的引脚连接.

第Ib部分

在您所描述的设置和结果(到目前为止)中,您有一个工作串行链路和另一个未知条件的串行链路.工作串行链接是:


 ----------(cable_A)----------- 

另一个串行链接包括:

 ----------(cable_B)----------- 

此测试假定所有四个串行端口都配置为115200 8n1.

通过选择性替换到工作链接,您可以验证第二个链接的组件是否正常工作.
例如,第一次替换可能是更换电缆:

 ----------(cable_B)----------- 

如果到控制台的链接仍然有效,那么下一个替换可能是交换PC端口连接:


 ----------(cable_B)----------- 

然后另一个串行链接现在包括

 ----------(cable_A)----------- 

所以现在第二个串行链路由先前已知的工作组件和ARM板上的一个未知端口组成.
重做你的测试.

第二部分

如果您仍然无法从交换中获得积极的结果,那么您需要提供有关设置的更多详细信息.你提到一些关于USB的东西.显然PC COM port_APC COM port_B都是USB端口和某些RS-232-to-USB适配器的组合?

请提供imx-uart.1imx-uart.1的电路板连接的详细信息.
这些接口是RS-232电压还是逻辑电平?
如果是逻辑电平,那你用什么来转换为RS-232?

如果您正在使用FTDI USB-to-TTL串行"电缆",那么这可能是一个问题.我遇到了连接到一个SoC的FTDI"电缆"的问题,它具有稍慢的波特率和慢的转换速率.问题是收到的数据总是垃圾字符总数.用USB-to-RS232适配器和MAX3232转换器(RS-232到3.3V逻辑)替换FTDI"电缆"解决了连接问题.
相比Sparkfun板和FTDI"电缆"(及其变体和翻版),我会建议使用一个真实的TTL到RS232转换器(使用MAX3232或类似的芯片)的可靠性.只有在您或某人确认设置确实有效后,才能使用Sparkfun板或FTDI"电缆".

在那种情况下,我有一个串口(在SoC上)固定在115200波特.
但是你可以完全控制你的情况.
因此,当您接收垃圾数据时,要尝试的一项测试是将波特率(在串行链路的两端)降低到9600甚至1200.

1 个回答
  • 根据/ proc/tty/driver/IMX-uart测试的正面结果和收到的垃圾数据,假设ARM板上的Linux在发出shell命令时发送输出似乎是安全的echo hello > /dev/ttymxc2.我们知道您在主机PC和/ dev/ttymxc2(串行控制台)之间有一个良好的串行链接.

    第Ia部分

    通常,要检查的第一项是imx-uart.2在电路板上的连接器上的输出.您需要一台示波器,并且可以确认逻辑电平或RS-232电压似乎没问题.此检查还要确认您已使用正确的引脚连接.

    第Ib部分

    在您所描述的设置和结果(到目前为止)中,您有一个工作串行链路和另一个未知条件的串行链路.工作串行链接是:


    <PC COM port_A> ----------(cable_A)-----------<imx-uart.1> 
    

    另一个串行链接包括:

    <PC COM port_B> ----------(cable_B)-----------<imx-uart.2> 
    

    此测试假定所有四个串行端口都配置为115200 8n1.

    通过选择性替换到工作链接,您可以验证第二个链接的组件是否正常工作.
    例如,第一次替换可能是更换电缆:

    <PC COM port_A> ----------(cable_B)-----------<imx-uart.1> 
    

    如果到控制台的链接仍然有效,那么下一个替换可能是交换PC端口连接:


    <PC COM port_B> ----------(cable_B)-----------<imx-uart.1> 
    

    然后另一个串行链接现在包括

    <PC COM port_A> ----------(cable_A)-----------<imx-uart.2> 
    

    所以现在第二个串行链路由先前已知的工作组件和ARM板上的一个未知端口组成.
    重做你的测试.

    第二部分

    如果您仍然无法从交换中获得积极的结果,那么您需要提供有关设置的更多详细信息.你提到一些关于USB的东西.显然PC COM port_APC COM port_B都是USB端口和某些RS-232-to-USB适配器的组合?

    请提供imx-uart.1imx-uart.1的电路板连接的详细信息.
    这些接口是RS-232电压还是逻辑电平?
    如果是逻辑电平,那你用什么来转换为RS-232?

    如果您正在使用FTDI USB-to-TTL串行"电缆",那么这可能是一个问题.我遇到了连接到一个SoC的FTDI"电缆"的问题,它具有稍慢的波特率和慢的转换速率.问题是收到的数据总是垃圾字符总数.用USB-to-RS232适配器和MAX3232转换器(RS-232到3.3V逻辑)替换FTDI"电缆"解决了连接问题.
    相比Sparkfun板和FTDI"电缆"(及其变体和翻版),我会建议使用一个真实的TTL到RS232转换器(使用MAX3232或类似的芯片)的可靠性.只有在您或某人确认设置确实有效后,才能使用Sparkfun板或FTDI"电缆".

    在那种情况下,我有一个串口(在SoC上)固定在115200波特.
    但是你可以完全控制你的情况.
    因此,当您接收垃圾数据时,要尝试的一项测试是将波特率(在串行链路的两端)降低到9600甚至1200.

    2023-01-11 17:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有