[已解决]TCPSend发送16进制数据
本帖最后由 dpale 于 2019-3-8 10:19 编辑解决方法在7楼 。。。。
需要发送的数据
$str ="AA 01 20 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CC"
需要怎么处理才能发送过去,前面建立TCP Socket 省略
TCPSend($iSocket, $str)
我用matlab发送 设备有反应
str = 'AA 01 20 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CC'
str2 = regexp(str, ' ', 'split');
num = hex2dec(str2)
st = tcpip('ip', 4196)
fopen(st)
fwrite(st, num)
fclose(st)
不知道TCPSend怎么发送这样的数据 本帖最后由 gyp2000 于 2019-3-8 03:54 编辑
可以这样写:
$str = "AA 01 20 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CC"
$str2 = StringSplit($str, " ", 2)
$num = ""
For $i = 0 To UBound($str2) - 1
$num &= Chrw(Dec($str2[$i]))
Next
TCPSend($iSocket, $num)
这个发送数据没问题 不过如果你接收也挨个转 ASCII 字符 那就会出错,
ASC函数只能处理 (0-127)之间的字符,170的话就会溢出,转换成97。
如果你一定要转换,那就需要用函数ASCW来转换,会得到170这个值。
最靠谱的办法,最好还是转换成二进制发送,这样减少了很多转换上的麻烦。
通过抓包软件比较了一下 au3tcpsend将所有的字符都依次转换为ASCII码发送 比需要发送的数据多了很多 这个怎么组织数据 求大佬们帮助 一个思路是转换aa为ascii表对应的字符 但是发送后会发生变化 本来170对应的字符变成97对应的字符 $binary =Binary('0x' & 'AA012001000000000000000000000000000000000000000000CC')
$send= StringTrimLeft($binary,2)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $send = ' & $send & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
$recive = Binary('0x' & $send)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $recive = ' & $recive & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console gyp2000 发表于 2019-3-8 01:57
可以这样写:
$str = "AA 01 20 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CC" ...
感谢G大,我们用它给网络端口的设备发指令,设备只识别16进制,用chrw的话"AA"和"CC"实际发送的也与预期不符(分别是61和a8)如果知道十六进制对应的传输编码,有没有可能直接发送翻译好的二进制数据代替十六进制让设备识别? gyp2000 发表于 2019-3-8 01:57
可以这样写:
$str = "AA 01 20 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CC" ...
感谢启发
最后的解决方法如下
$str = 'AA 01 20 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CC'
$str2 = stringreplace(str, ' ', '')
$bin = binary("0x" & str2)
tcpsend($isocket, $bin) 有点意思..
页:
[1]