dpale 发表于 2019-3-7 15:31:41

[已解决]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 01:57:53

本帖最后由 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这个值。
最靠谱的办法,最好还是转换成二进制发送,这样减少了很多转换上的麻烦。

dpale 发表于 2019-3-7 17:03:59

通过抓包软件比较了一下 au3tcpsend将所有的字符都依次转换为ASCII码发送 比需要发送的数据多了很多 这个怎么组织数据 求大佬们帮助

dpale 发表于 2019-3-7 18:03:04

一个思路是转换aa为ascii表对应的字符 但是发送后会发生变化 本来170对应的字符变成97对应的字符

tubaba 发表于 2019-3-7 22:01:42

$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

wo190191497 发表于 2019-3-8 07:37:13

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)如果知道十六进制对应的传输编码,有没有可能直接发送翻译好的二进制数据代替十六进制让设备识别?

dpale 发表于 2019-3-8 10:17:54

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)

ws7721 发表于 2019-3-8 21:29:08

有点意思..
页: [1]
查看完整版本: [已解决]TCPSend发送16进制数据