Ubuntu服务器,8中继usb板需要打开一盎司以上



我买了一块中国usb 8继电器开关板。它在ubuntu服务器中显示为串行设备。我想出了让它工作的命令。

*设置中继板的波特率

stty -F /dev/ttyUSB0 9600 -parity cs8 -cstopb

启动继电器控制器:

echo -e -n "x50" > /dev/ttyUSB0 

激活指令继电器:

echo -e -n "x51" > /dev/ttyUSB0

打开继电器

echo -e -n "x(number)" > /dev/ttyUSB0*

但我的问题是,如果我打开继电器1(/x01(,然后打开继电器2(/x02(,继电器1就会关闭。我正在尝试自动化,需要它一次打开多个继电器。我通过了测试人员,开始绘制每个数字,比如03打开继电器01和02。但必须有一个更简单的方法。任何帮助都将不胜感激。

它是一个逐位控件。

例如,要只打开端口0(第一个(,请发送\xFE。

(echo "obase=16" ; echo $((255 ^ 1)))|bc| sed -e 's/^/\x/'
0xFE

基本上取255,并为您希望启动的每个端口减去这些值:|端口|编号||--|---||0|1||1|2||2|4||3|8||2016年4月||5|32||6 | 64||7 | 128 |

要转动继电器1、4、5和7,您需要发送:

255 (all 8 bits stop)  - 2 (bit 1 start) - 16 (bit 4 start) - 128 (bit 7 start) = 109.

在十六进制109中是6D,所以将\x6D发送到设备。

一个更直观的例子:

#!/bin/bash 
varfolder=/dev/shm

for i in $(find -L /sys/bus/usb/devices/ -maxdepth 2 -name "ttyUSB*"); do
usb=$(egrep -i "2303" $i/../modalias >/dev/null && echo "${i##*/}")
check=$(grep PRODUCT= /sys/bus/usb-serial/devices/$usb/../uevent)
if [ "$check" == "PRODUCT=67b/2303/300" ]; then
releport=/dev/$usb
fi
done

## this word "modif" depends on the linux interface language
modf_time=$(stat /sys/bus/usb-serial/devices/$usb | grep  modif)
init_time=$(<$varfolder/init_usb_relay)

if [ "$modf_time" != "$init_time" ] ; then 
echo -e -n "x50" > $releport
echo -e -n "x51" > $releport
echo $modf_time > "$varfolder/init_usb_relay"
fi

# 87654321
# turn off 6 and 5 relay
relstatusbin=11001111
relstatus16=$(echo "ibase=2;obase=10000;$relstatusbin"|bc)
echo -e -n "x$relstatus16" > $releport

已知问题:

  • 如果USB线没有携带足够的电力来固定继电器线圈,则继电器将不会通电。在这种情况下,需要额外的电源。或者同时关闭少量继电器
  • 触点可能会卡住
  • 触点可能会烧坏
  • 如果设备停止接受命令,那么为了不重新启动Linux,您需要删除设备rm -f /dev/ttyUSB0

相关内容

  • 没有找到相关文章