我的 ttyS0 串行非常慢,几乎无法使用。
硬件是这样的
Slackware 15 上的内核是 5.15.161
主板是 A88XM-E/A88XM-E 带 coreboot
并且串行的设置是那些
console=ttyS1,115200 用于内核命令行,getty 115200
我也尝试过 19200,没有成功。有什么想法吗?
我正在使用时下流行的 Huawei Brovi E3372-325 LTE USB Stick 将一台 Linux 机器连接到互联网。特殊要求是传入的 ssh/ping/NTP/... 连接必须到达我的 linux 操作系统。
状态是,使用usb_modeswitch -X
和option driver
I 可以调出 3 个 ttyUSB 接口,并使用 连接成功wvdial
。但由于某种原因,ifconfig
没有列出 ppp0 接口的硬件/MAC 地址,同一 APN 网络上的设备无法 ping 我的 IP 地址。我认为原因不是 ISP 阻塞,因为我的其他设备在网络上可以 ping 通。
的输出ip addr
19: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 3
link/ppp
inet 10.250.0.112 peer 10.64.64.64/24 scope global ppp0
valid_lft forever preferred_lft forever
我正在为嵌入式板上的 Linux 操作系统编写 GTK C 应用程序。
第一个主窗口打开一个串行(虚拟)端口,用于从条形码阅读器接收数据。我正在使用标准的 open() 函数(在我的 OpenPort() 函数中)。然后我调用 g_io_channel_new_file() 和 g_io_add_watch() 来处理 rx 信号。
我真的需要标准的 open() 调用吗?
if (g_config.fdRfid==-1)
g_config.fdRfid = OpenPort( g_config.portRfid, B115200);
if (g_config.fdRfid!=-1)
{
ShowMainMessage();
GError *error = NULL;
g_ioChannel = g_io_channel_new_file( g_config.portRfid, "r", &error);
if (g_ioChannel)
{
guint source = g_io_add_watch( g_ioChannel, G_IO_IN | G_IO_PRI, serialRfidWatcher, &g_config);
printf("> set watch ioCh: %p - source: %d\n", g_ioChannel, source);
}
else
gtk_label_set_text( GTK_LABEL(g_labelMsg2), error->message);
当我按下一个按钮时,我打开一个对话框子窗口:在此之前,我通过 close() 函数关闭串行端口,并通过 g_io_channel_shutdown() 函数断开信号。返回的状态为 1 = G_IO_STATUS_NORMAL。
GIOStatus status = g_io_channel_shutdown( g_ioChannel, TRUE, NULL);
g_io_channel_unref(g_ioChannel);
if (g_config.fdRfid != -1)
{
ClosePort(&g_config.fdRfid);
}
启动对话窗口,我再次打开相同的端口(这是一个用于测试的窗口),并以与之前相同的方式重新连接 rx 信号。
现在,如果我在调试输出中读取条形码(通过 printf),我会看到主窗口的信号处理程序和对话框中的处理程序都被调用。
关闭对话框(关闭端口和通道...)我返回到主窗口。如果我读取条形码,将触发三个处理程序,两个在主窗口上,一个在对话框上。
我怎样才能断开信号处理程序?我认为我的方法不完整..
谢谢!
我正在使用 Ubuntu 22.04。
我刚买了 CC2652RB USB Zigbee ( https://slae.sh/projects/cc2652/ ) 但在我的 Ubuntu 中它没有创建/dev/serial
文件夹。
这是sudo lsusb -d 10c4:ea60 -v
输出
Bus 001 Device 010: ID 10c4:ea60 Silicon Labs CP210x UART Bridge
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x10c4 Silicon Labs
idProduct 0xea60 CP210x UART Bridge
bcdDevice 1.00
iManufacturer 1 Silicon Labs
iProduct 2 slae.sh cc2652rb stick - slaesh's iot stuff
iSerial 3 00_12_4B_00_23_93_25_9F
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x0020
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 2 slae.sh cc2652rb stick - slaesh's iot stuff
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Device Status: 0x0000
(Bus Powered)
在我看来,我认出了……好吗?
编辑
sudo dmesg
[ 8907.724914] usb 1-2: new full-speed USB device number 12 using xhci_hcd
[ 8907.876075] usb 1-2: New USB device found, idVendor=10c4, idProduct=ea60, bcdDevice= 1.00
[ 8907.876084] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 8907.876087] usb 1-2: Product: slae.sh cc2652rb stick - slaesh's iot stuff
[ 8907.876090] usb 1-2: Manufacturer: Silicon Labs
[ 8907.876092] usb 1-2: SerialNumber: 00_12_4B_00_23_93_25_9F
[ 8907.879007] cp210x 1-2:1.0: cp210x converter detected
[ 8907.881809] usb 1-2: cp210x converter now attached to ttyUSB0
[ 8909.071926] usb 1-2: usbfs: interface 0 claimed by cp210x while 'brltty' sets config #1
[ 8909.072514] cp210x ttyUSB0: cp210x converter now disconnected from ttyUSB0
[ 8909.072552] cp210x 1-2:1.0: device disconnected
解决了!
sudo apt-get remove --auto-remove brltty
brltty 是盲文 TTY。
我们最近从 Vecow/Plugin 升级到新的工业 PC,从 18.04 升级到 Ubuntu 20.04。从 BIOS(构建日期 BIOS ~17.02.2022)和根据它的 IO 芯片是 SuperIO 8786: https ://github.com/huchanghui123/ITE-SuperIO/blob/master/IT8786E-I_B_V0.2.pdf
此端口似乎被映射为通用(ACPI/BIOS)作为兼容 16550A 的 COM 端口 PNP0501。
我们有一个 PPS 设备连接到我们可用的一个(但尝试了所有)串行/COM/RS232 端口(DCD 引脚,我们还连接了 GND)。我们附加到它ldattach pps /dev/ttyS0
并希望再次与 chrony 集成。
ldttach
作品,也ppstest
。发生的情况是,在很短的时间(30-100 秒)之后,这似乎是相当随机的,它经常无法获取时间戳并且超时并且永远不会恢复。但是在卸载并重新连接 ldisc 之后,它会再次工作(一段时间)。
除了我们的 PPS 设备,我们还尝试了 1 Hz 的函数发生器(脉冲或占空比 50%、1ms、10ms、100 和 200 ms)。我们的设备在以前的 PC 上工作的电压电平是 0 - ~3.7V。我们将函数发生器设置为在 RS-232 范围内以 +/-3.7、5、6.6 和 10V(我们的发生器的上限)运行。问题是一样的。
顺便说一句,我们在 HWE 通用内核上(所以 5.13)。在旧 PC 上它可以工作(甚至通过 Ubuntu 20.04 直播)。我们还尝试了 Ubuntu 22.04 实时映像(内核 5.15)和 Fedora 35,但也失败了。同样在我们的第二台相同的 PC 上。
任何人都经历过类似的事情或知道如何进一步调试它?特别是要排除驱动程序错误(或任何其他硬件错误)。
谢谢!
有没有一种方法可以让一台计算机/dev/
与另一台计算机共享目录中的设备,而另一台计算机可以与其交互,如果它是本地的?类似于 SSH 隧道的东西?
例如相机,或与 arduino 的串行连接,甚至是计算机的/dev/random
?
玩复古计算我已经成功配置了一个 isdn pci TA,设置连接我使用这样的脚本
#!/bin/sh
isdnctrl addif ippp0
isdnctrl addslave ippp0 ippp1
isdnctrl eaz ippp0 myphone
isdnctrl eaz ippp1 myphone
isdnctrl l2_prot ippp0 hdlc
isdnctrl l3_prot ippp0 trans
isdnctrl l2_prot ippp1 hdlc
isdnctrl l3_prot ippp1 trans
isdnctrl encap ippp0 syncppp
isdnctrl encap ippp1 syncppp
isdnctrl secure ippp0 on
isdnctrl secure ippp1 on
isdnctrl chargehup ippp0 off
isdnctrl addphone ippp0 out outphone
isdnctrl addphone ippp1 out outphone
isdnctrl dialmode ippp0 manual
isdnctrl dialmode ippp1 auto
isdnctrl callback ippp0 off
isdnctrl callback ippp1 off
ifconfig ippp0 -arp -broadcast
ipppd user myuser \
defaultroute \
noipdefault \
-detach \
mru 1524 \
-bsdcomp \
/dev/ippp0 & sleep 1
isdnctrl dial ippp0
isdnctrl addlink ippp1
#to return to a 64Kbit i USE isdnctrl removelink ippp1
设置串行调制解调器(TA 更好)太容易了,就像使用 pppd+chat 脚本设置 56k 调制解调器我的问题是..有人知道在 Linux 上设置 128k(双通道)与串行 TA 连接的命令/字符串吗?
我有两个串口,一个通过主板 (/dev/ttyS0) 提供,一个通过牛津芯片 (/dev/ttyS1) 从 PCIE 到 RS232 卡 (Startech 2S952) 提供(有 /dev/ttyS2 但它没有进入这个故事)。在我的情况下如何解释波特率?
[ 1.111618] 00:03: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
[ 1.112543] 0000:08:00.0: ttyS1 at I/O 0xf010 (irq = 40, base_baud = 4000000) is a 16550A
我将逻辑分析仪连接到串行端口的 Tx/Rx 线。当我做:
stty -F /dev/ttyS0 115200
echo "ABCDEFGH" > /dev/ttyS0
然后我可以在逻辑分析仪上解码“ABCDEFGH”字符串,后跟 0x0D 0x0A,但我必须告诉它波特率为 115200。此外,当我将笔记本电脑与 USB 串行适配器(通过空调制解调器电缆)连接并读取关闭串口,只有当我将接收器设置为 115200 时,我才会得到有意义的输出。据我所知,这是应该的。
现在使用 /dev/ttyS1:
stty -F /dev/ttyS1 115200
echo "ABCDEFGH" > /dev/ttyS1
我在分析的逻辑中清楚地看到,我的消息以毫秒为单位要慢得多。事实上,它慢了大约 34.7(2) 倍,40000000/115200 = 34.7(2)。特别是,接收方膝上型计算机接收到由几个 0x00 组成的消息。当我设置为 3200 波特时,它会出现乱码。显然,该消息实际上是以 115200/34.6 = 3339.13...bps 传输的。
使用 /dev/ttyS1:
stty -F /dev/ttyS1 4000000
echo "ABCDEFGH" > /dev/ttyS1
与 /dev/ttyS1 的通信发生的位持续时间与预期的 115200 相匹配。
那么这意味着在我的情况下:
[ 1.112543] 0000:08:00.0: ttyS1 at I/O 0xf010 (irq = 40, base_baud = 4000000) is a 16550A
应该解释为“4000000”是一些内部振荡器的频率,导致在现实世界中传输 115200。我希望这个值是硬件内部的,并且隐藏在驱动程序的深处。
我错过了什么?这是我第一次使用串行端口,所以我完全迷失了。
如果我将“console=ttyS1,4000000n8”作为内核参数传递,那么我可以在笔记本电脑上设置 115200 通过串行通信。
我需要使用从 SC16IS752 适配器获得的串行端口。我已经从 /boot/config.txt 设置了它们,它们在 /dev 中显示为 ttySC0、ttySC1、ttySC2 和 ttySC3,它们可以工作。
问题是,每当我启动 Raspberry 时,端口的命名缺乏一致性:有时设备连接到 ttySC0,有时连接到 ttySC2。
我试图四处寻找帮助,但我找到了仅适用于 USB-UART 适配器的解决方案:它是为每个物理设备创建符号链接。我试图遵循的解决方案是这个:
我试图应用相同的点,但我注意到参数有几个不同,所以我被卡住了。
那么...如何为从 SPI-UART 适配器提供的串行端口创建符号链接?
先感谢您。
我在 wine 中运行一个 Windows 应用程序。该应用程序只能看到 COM 端口 1-4。
我的系统有以下 USB 串行设备:
# lsmod | grep cp210x
cp210x 36864 0
# ls /dev/ttyUSB0
crw-rw---- 1 root uucp 188, 0 Feb 14 00:42 /dev/ttyUSB0
如何将其作为 COM1 呈现给葡萄酒应用程序?