TC官方合作论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: slc18590

[问题] 串口通讯插件怎么发送16进制

[复制链接]
发表于 2021-9-7 13:59:09 | 显示全部楼层
本帖最后由 bestkakkoii 于 2021-9-7 14:21 编辑
slc18590 发表于 2021-9-7 13:46
可以了,大佬." " 就是发01,但是如果是 01 32 01 32 这种呢?

你在自身进程申请一段内存 把数据写入 然后用 读内存字符串把他读出来后(要用char *读)再調用他的接口就好了
写入用 WriteProcessMemory 一个一个字节10进制写入



function test()
    var p = array()
    p["hwnd"] = windowgetmyhwnd()
    p["pid"] = information(p["hwnd"], 5)
    p["handle"] = information(p["pid"], 2)
    p["cache"] = ""
    p["addr"] = varaddress(p["cache"])
    p["bytearray"] = "01 32 01 32"
    WriteData(p["handle"], p["addr"], p["bytearray"])
    traceprint(addressvalue(p["addr"], "char *", 0))//这里读出来就是你要传给单片的
    sp.WriteData(result)
    p = null
end






回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 14:31:39 | 显示全部楼层
bestkakkoii 发表于 2021-9-7 13:59
你在自身进程申请一段内存 把数据写入 然后用 读内存字符串把他读出来后(要用char *读)再調用他的接口就好 ...

>错误:D:\学习\串口通讯.t 行号:32 错误信息:函数调用不存在:WriteData
回复 支持 反对

使用道具 举报

发表于 2021-9-7 14:36:20 | 显示全部楼层
本帖最后由 bestkakkoii 于 2021-9-7 15:18 编辑
slc18590 发表于 2021-9-7 14:31
>错误:D:\学习\串口通讯.t 行号:32 错误信息:函数调用不存在:WriteData

我意思是 你要自己用 dllcall调用 kernel32.dll 的 WriteProcessMemory




function button1_click()
    traceprint(WriteData(strtrim(editgettext("edit0"))))
end
function WriteData(ByteArray)
    //取自身进程句柄 非PID或HWND
    var Handle = information(dllcall("kernel32.dll", "DWORD", "GetCurrentProcessId"), 2)
    var Ret = ""
    var RetArray
    var n = strsplit(ByteArray, " ", RetArray)
    //申请一段本进程空白内存
    var addr = dllcall("kernel32.dll", "DWORD", "LocalAlloc", "DWORD", 0, "DWORD", n)
    var VarValue
    //写入字节集
    for(var p = 0; p < n; p++)
        VarValue = cint(RetArray[p], 1)
        dllcall("kernel32.dll", "BOOL", "WriteProcessMemory", "HANDLE", Handle, "DWORD*", addr + p, "DWORD*", getvarpointer(VarValue) + 8, "int", 1, "int*", 0)
    end
    //内存字符串读取
    Ret = readstring(Handle, addr, n, 0)
    //释放申请的内存
    dllcall("kernel32.dll", "DWROD", "LocalFree", "HLOCAL", addr)
    sp.WriteData(Ret)
    return Ret
end




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 16:11:56 | 显示全部楼层
bestkakkoii 发表于 2021-9-7 14:36
我意思是 你要自己用 dllcall调用 kernel32.dll 的 WriteProcessMemory

明白了,大佬.现在处理01 02 03 04.这种没问题,但是如果处理 01 ab 00 04 0C.这种就会返回"?".这是为什么.
回复 支持 反对

使用道具 举报

发表于 2021-9-7 16:52:56 | 显示全部楼层
本帖最后由 bestkakkoii 于 2021-9-7 16:59 编辑
slc18590 发表于 2021-9-7 16:11
明白了,大佬.现在处理01 02 03 04.这种没问题,但是如果处理 01 ab 00 04 0C.这种就会返回"?".这是为什么. ...

旁边还有一些无法显示的空白 不是只有问号而已


不过说到底这种 字符串 转 十进制 写入 又转字符串读出 再傳出(实际上它插件内部又再一次 字符串转16进制....) 相當的....多于

你还是研究一下怎么用VS C++写一个小插件比较实在
不需要100%自己手打 就是网上找可用的源码稍微修改一下能编译成TC能调用的dll就好



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2021-9-20 23:42:38 | 显示全部楼层
你是要控制继电器吧
回复 支持 反对

使用道具 举报

发表于 2022-11-24 01:48:38 | 显示全部楼层
            


请问大家我用的TC脚本,我要发送A0 01 06 A7这个16进制的   sp.WriteData("A0 01 06 A7")这样写不行,请问正确的怎么写




变量 ret12=注册插件("D:\\tcpSerialPort.dll",真)
            如果(ret12)
                消息框("插件注册成功")
            结束
            
            
            变量 sp = 插件("tcp.SerialPort.1")
            等待(2000)
            sp.InitPort(1,9600,1,8,1)
            等待(2000)

            sp.WriteData("A0 01 06 A7")
            等待(2000)
            sp.ClosePort()
            
            退出
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-4-26 08:16 , Processed in 0.037121 second(s), 20 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表