我有类似的物品 ICSE013A:
Bus 001 Device 009: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
/dev/serial/by-path/platform-20980000.usb-usb-0\:1.3\:1.0-port0
/dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0
/sys/bus/usb-serial/drivers/pl2303/ttyUSB1
但我认为我遇到了错误或设计缺陷。
拔下并重新插入设备。
在第一个控制台中,运行一个永久的:
$ cat /dev/ttyUSB1
在第二个控制台中,运行
$ echo -e -n "\x50" > /dev/ttyUSB1
运行几次;每次您都会在第一个控制台(ab、ac 或 ad)中收到一个 ack。现在发送启动命令:
echo '51' | xxd -r -p >>/dev/ttyUSB1
你没有得到任何确认。再次发送同一行:
echo '51' | xxd -r -p >>/dev/ttyUSB1
开关 1 打开,没有确认。发送 50,开关关闭,没有 ack:
echo '50' | xxd -r -p >>/dev/ttyUSB1
所以,命令的顺序很重要。发送 50-51 后,所有字节都将控制继电器。对于随机运行的脚本,无法知道设备是否已经启动。一种解决方案可能是在启动时在 /etc/rc.local 中运行初始化:但假设您的 USB 电源出现故障:您认为您可以控制继电器,而实际上,它们正在等待初始化。继电器设计不佳。这是我能找到的最便宜的:4e 用于 2 个继电器,9e 用于 8r 板。其他 USB 中继要贵得多,但具有抵抗初始化问题的逻辑:它们需要接收完整的帧,包括校验和……对于每个中继命令。诸如“A0 01 01 A2”或“01 05 00 00 FF 00 8C 3A”之类的东西。
此外,将订单分组到一个框架中也会失败。如果重启后你这样做了
echo '50 51 03' | xxd -r -p >>/dev/ttyUSB1
它不会打开继电器。您必须一个一个地发送字节;一个简单的 sleep 0.001 (使用 bash 内部命令)似乎就足够了。行为可能因 shell 版本、内核和发行版而异:
i=0.001
echo '50' | xxd -r -p >>/dev/ttyUSB1 ; sleep $i
echo '51' | xxd -r -p >>/dev/ttyUSB1 ; sleep $i
echo '03' | xxd -r -p >>/dev/ttyUSB1
现在,发送这个命令:
echo '50 51 03' | xxd -r -p >>/dev/ttyUSB1
它会关闭中继,而不提供 ack。那么,如何确定重置板?从软件上看,这似乎很复杂;根据硬件,重新启动可能不会重置所有 USB 设备。重新加载 pl2303 是不够的。在普通桌面上,将整个 USB 堆栈卸载到 usbcore 应该允许重置设备。在 rPi 上,usbcore 不是模块化的,卸载 usbserial 是不够的。
所以,对于我的 rPi,我必须在启动时在 /etc/rc.local 中执行此操作
echo '50' | xxd -r -p >>/dev/ttyUSB1
echo '51' | xxd -r -p >>/dev/ttyUSB1
并假设设备不会断开连接
另外:不可能知道继电器的状态;当您想更换一个继电器时,您需要在某处记住(存储)其他继电器的状态。即使这方面是由守护服务管理的,如果你热重启服务,服务也无法知道板子是否已经初始化;如有疑问,服务将不得不这样做,并发送 50-51-00 并在其间发送适当的小睡眠;但是,在它已经初始化的情况下,这可能会激活继电器 1、5 和 7 一小段时间。
不同的方法:我的板子有一个串口输入(USB插头左侧有4个空孔)。我焊接了几个引脚,并将其连接到 USB 串行适配器(Rx 和 Tx 标记是倒置的)。事情的表现完全一样。
经过数小时的二分法,我找到了一个可以处理初始化的字符串,并且在启动后仍然可以使用。使用这种方法,OFF 继电器不会受到影响; ON 继电器在 8ms 内断开(不要尝试添加电容器,它可能会产生振荡)。根据受控设备对断开连接的敏感程度,这个小的关闭时间可能是可接受的(或不可接受的):
echo '50 00 50 00 51 01 00 ZZ' | xxd -r -p >>/dev/ttyUSB1
其中 ZZ 是继电器控制字节。这是一个也可以使用的替代模板:
echo '50 50 50 50 51 52 00 ZZ' | xxd -r -p >>/dev/ttyUSB1
编辑:经过几个小时测试这张卡,硬件板不可靠。这个简单的测试失败了:每隔 10 或 20 秒,继电器就会处于关闭状态:
while true ; do echo -e -n "\x03" > /dev/ttyUSB1 ; sleep 1 ; done
它非常慢,并且仍然会触发固件内部的竞态问题......并且此测试通过板载 USB 插头和使用第三方串行端口适配器均失败。 ICSE013A没有什么好的