问题描述
我想测试我的MärklinDigital模型铁路系统的某些功能。它基本上由一个(Märklin)中央单元和一个(Märklin)接口组成。这是将PC的系统命令通过ComPort发送到接口以设置螺线管或控制系统的最低配置。信息也可以通过接口ComPort从轨道检测模块发送回PC。在这种情况下,将发送回两个字节。对于这种情况,说明中提供了Basic中的示例,我尝试将其翻译为Win Power Shell。
基本示例:
10 OPEN "COM1:2400,N,8,2"FOR OUTPUT AS #1
20 OPEN "COM1:2400,2"FOR INPUT AS #2
10 OPEN "COM1:2400,2"FOR INPUT AS #2
30 PRINT #1,CHR$(193);:a$=INPUT$(2,#2)
30 PRINT #1,#2)
40 contact=ASC(LEFT$(a$,1)):PRINT contact
50 contact2=ASC(RIGHT$(a$,1)):PRINT contact2
我的“翻译”:
$connectionproxy = new-object System.IO.Ports.SerialPort com1
$connectionproxy.Baudrate = 2400
$connectionproxy.stopbits = "two"
$connectionproxy.DataBits = 8
$connectionproxy.Parity = "None"
$connectionproxy.open()
do { $connectionproxy.write([char]([int]193)) $ShowBytes = $connectionproxy.ReadLine() Write-Host $ShowBytes } while($connectionproxy.IsOpen)
我的翻译中有什么问题/遗漏了?
解决方法
有了一些认真的支持(兄弟和一个好朋友),我现在可以提供所需的功能。所有功能均已通过 Märklin 6020/6023/6050/6088 测试。
1.) “Windows 7 Power Shell”,但没有 Rückmeldemodul S88 (6088) 的功能:
#---init command sets---
$commandset = @()
#---init connection---
$connectionproxy = new-object System.IO.Ports.SerialPort com1
$connectionproxy.BaudRate = 2400
$connectionproxy.stopbits = "two"
$connectionproxy.DataBits = 8
$connectionproxy.Parity = "None"
do {
$userimput = Read-Host -Prompt "Numbers seperated by space"
$currentcommand = $userimput.split(" ")
$connectionproxy.open()
for ($i=0;$i -lt $currentcommand.length;$i++) {
$connectionproxy.write([char]([int]$currentcommand[$i]))
start-sleep -milliseconds 10
}
$connectionproxy.close()
}while($true)
2.) "Ruby On Rails" 用于 Rückmeldemodul S88 (6088) 的使用。该程序读取 S88 发回的字节并显示其引脚分配:
require 'rubyserial'
class Integer
def to_bin(width)
'%0*b' % [width,self]
end
end
puts "open serial port..."
serialport = Serial.new "COM1",2400,8,:none,2
puts serialport.inspect
puts "Reset command for S88:"
bytes_written = serialport.write 192.chr
puts bytes_written.to_s + " bytes written"
sleep(0.1)
puts "Read first S88:"
bytes_written = serialport.write 193.chr
puts bytes_written.to_s + " bytes written"
sleep(0.1)
b1 = serialport.getbyte.inspect
puts "Byte 1: " + b1 + " (" + b1.to_i.to_bin(8) + ")"
b2 = serialport.getbyte.inspect
puts "Byte 2: " + b2 + " (" + b2.to_i.to_bin(8) + ")"
问题 1:Windows Power Shell 无法根据请求恢复任何字节。如果有人知道一个好的解决方案,欢迎您分享。 问题 2:Rückmeldemodul 6088 及其到中心站或接口的电缆必须远离导轨放置,因为会干扰信号。 (屏蔽六芯线绝对惨。)