命令行CALL程序时传递数字参数总结

 

在命令行CALL程序时,如果程序带数字参数,直接传递数字往往 会报错,因此汇总资料如下

  

设程序 PgmA 有参数 Parm1, Parm2:

 

1)parm1(7S 0) = 276,parm2(7S 2) = 15.73

 

传递方式:CALL  PGMA PARM('0000276'  '0001573')

 

2)parm1(7S 0) = -276,parm2(6S 2) = -15.73

 

传递方式:CALL  PGMA PARM('-000276'  '-01573')

 

3)parm1(7P 0) = 276,  parm2(7P 2) = 15.73

 

传递方式:CALL  PGMA PARM( X'0000276F'  X'0001573F')

 

4)parm1(6P 0) =  276 , parm2(6P 2)=15.73

 

传递方式:CALL  PGMA PARM( X'F000276F'  X'F001573F')

 

5)parm1(7P 0) =  -276 , parm2(6P 2)=-15.73

 

传递方式:CALL  PGMA PARM( X'0000276B'  X'F001573B')

 

总结:

 

对于S类型的参数,只要按照字符串的形式,在没有数字的位置补0,不用输入小数点,就可以得到正确的结果,如果是负数,在第一位输入负号 - 即可,但是会占用一个数字位,7位的负数就只能输入6位数字了。

 

对于P类型的参数,数字部分按照S类型的一样输入,还需要在字符串前加 X,并且如果长度为奇数,需要给字符串加 F 后缀,如果长度为偶数,需要在字符串的前后都加 F。如果是负数的,需要把字符串后面的F变为B。(X表示按16进制取值,由于P类型的数据存储方式是半个字节存储一个数字,所以需要在前后加其它的字母补齐空位。)

<think>我们正在讨论如何使用gdbuscall命令调用D-Bus接口,并传入参数-4。根据用户的问题,我们需要展示一个具体的示例,其中包含一个整数参数-4。首先,我们需要知道gdbuscall命令的基本语法:gdbuscall--system(或--session)--dest<总线名>--object-path<对象路径>--method<接口.方法>[参数...]参数需要按照D-Bus签名指定的类型传递。整数类型在D-Bus中通常用'i'表示(32位整数)或'x'(64位整数)。我们需要根据接口定义来确定具体类型,但通常对于整数,我们可以尝试使用'i'。用户要求传入-4,这是一个负数,因此我们需要确保在参数中正确表示负数。在gdbuscall中,参数通过GVariant格式传递。对于整数,我们可以直接写数字,负数前面加负号。示例格式:gdbuscall--system--dest"com.example.Service"--object-path"/com/example/Object"--method"com.example.Interface.MethodName"-4但是,注意:参数需要放在一个GVariant元组中,即使只有一个参数。所以我们需要用括号将参数括起来,并且指定类型。实际上,gdbuscall命令要求参数以GVariant格式给出。对于单个整数参数,我们可以这样写:'(i-4)'。其中,'i'表示32位整数,-4是值。因此,完整的命令可能如下:gdbuscall--system--dest"com.example.Service"--object-path"/com/example/Object"--method"com.example.Interface.MethodName""(i-4)"但是,请注意,如果接口方法期望多个参数,我们需要提供多个值,例如:'(ii)'后跟两个整数,但这里只有一个。由于用户没有提供具体的接口、对象路径和方法名,我们只能给出一个假设的示例。假设我们要调用的接口是:com.example.Calculator,对象路径是:/com/example/Calculator,方法名是:AddNumber,该方法期望一个整数作为参数,然后将其加到内部状态。那么命令如下:gdbuscall--session--dest"com.example.Calculator"--object-path"/com/example/Calculator"--method"com.example.Calculator.AddNumber""(i-4)"注意:这里使用了--session总线,因为用户程序可能运行在用户会话总线。如果服务在系统总线,则使用--system。如果方法定义期望的是其他类型的整数(比如64位),那么我们应该使用'x',例如:'(x-4)'。因此,关键在于知道接口方法期望的参数类型。如果不知道,可能需要查阅接口文档。另外,如果方法不需要参数,则可以不写参数部分。如果方法有多个参数,则需要按照顺序和类型提供。例如,两个整数参数:第一个是-4,第二个是5,则参数部分写为:'(ii-4,5)'。但是,用户的问题中只要求传入一个-4,所以我们只用一个参数。下面是一个假设的示例,调用一个名为“SetValue”的方法,传入-4:gdbuscall--system--dest"org.example.Service"--object-path"/org/example/Object"--method"org.example.Interface.SetValue""(i-4)"为了更具体,我们可以参考用户提供的引用[2]中dbus-send的例子,但注意gdbuscall和dbus-send的语法不同。另外,用户提到了引用[1]中的sd_bus_open_system等,但这是C语言的API,与命令行工具无关,所以我们不在此处使用。现在,我们给出一个完整的示例命令:gdbuscall--system--dest"com.example.Device"--object-path"/com/example/Device"--method"com.example.Device.SetTemperature""(i-4)"这个命令假设在系统总线上有一个服务com.example.Device,对象路径/com/example/Device,接口com.example.Device,方法SetTemperature,它接受一个整数(表示温度值)作为参数,这里我们传入-4。注意:如果方法定义中参数类型不是整数,而是其他类型(比如字符串),那么传入整数会导致错误。因此,在实际使用中,需要确保参数类型匹配。最后,我们总结一下步骤:1.确定要使用的总线(--system或--session)。2.确定目标服务的总线名(--dest)。3.确定对象路径(--object-path)。4.确定接口和方法名(--method)。5.根据方法的签名,构造GVariant格式的参数。对于单个整数参数-4,GVariant格式为:'(i-4)'。如果方法没有参数,则不需要提供参数部分。如果方法有多个参数,则按照顺序和类型在元组中列出,例如:'(si-4,"string")'表示一个字符串和一个整数。希望这个示例能够满足用户的需求。</think>### 使用 gdbus call 调用 D-Bus 接口并传参 -4 的示例 #### 1. **基本语法** ```bash gdbus call --<bus-type> --dest <服务名> --object-path <对象路径> --method <接口名.方法名> <GVariant格式参数> ``` - `--session`:用户会话总线(默认) - `--system`:系统总线 - **参数格式**:需转换为 GVariant 类型,整数用 `i` 或 `x` 表示(32位/64位),负数直接写 `-4`。 --- #### 2. **传入 -4 的示例** 假设调用系统总线上 `com.example.Service` 服务的 `SetValue` 方法,参数为整数 -4: ```bash gdbus call --system \ --dest "com.example.Service" \ --object-path "/com/example/Object" \ --method "com.example.Interface.SetValue" \ "(i -4)" ``` ##### 关键说明: - `(i -4)`:GVariant 格式参数 - `i`:32位整数类型签名 - `-4`:参数值(直接写负数) - 若接口要求 64 位整数,使用 `(x -4)` --- #### 3. **实际场景示例** **场景**:通过 `org.freedesktop.UPower` 接口设置电池警告阈值(假设方法接受负数参数): ```bash gdbus call --system \ --dest "org.freedesktop.UPower" \ --object-path "/org/freedesktop/UPower" \ --method "org.freedesktop.UPower.SetWarningLevel" \ "(i -4)" ``` --- #### 4. **注意事项** 1. **参数类型匹配**: 必须与接口定义的签名一致(可通过 `gdbus introspect` 查看接口签名): ```bash gdbus introspect --system --dest com.example.Service --object-path /com/example/Object ``` 2. **复合参数**: 若方法需多个参数(如整数+字符串),格式为 `(is -4 "text")`。 3. **错误处理**: 若参数类型不匹配,将返回类似错误: ``` Error: GDBus.Error:org.freedesktop.DBus.Error.InvalidArgs: Invalid argument ``` --- #### 5. **对比 dbus-send 命令** 与 `dbus-send` 不同,`gdbus call` 直接支持 GVariant 语法: ```bash # dbus-send 等效示例(需转义) dbus-send --system --dest=com.example.Service \ /com/example/Object \ com.example.Interface.SetValue \ int32:-4 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值