搜索
bottom↓
回复: 5

请教Linux中用dbus收发结构体数据

[复制链接]

出0入0汤圆

发表于 2015-11-20 09:28:52 | 显示全部楼层 |阅读模式
本帖最后由 zhongjp85 于 2015-11-20 09:58 编辑

请教下如何使用dbus原始库收发一个结构体数据?

struct data
{
        int a;
        uchar buf[10];
}


现在有用到dbus库

然后打算在原始dbus库基础上对外广播数据  

dbus发送简单的uint已经调通了 可是怎么发送复杂的结构体还没有头绪

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2015-11-20 09:34:35 | 显示全部楼层
啥意思?

出0入0汤圆

 楼主| 发表于 2015-11-20 09:58:34 | 显示全部楼层

现在有用到dbus库

然后打算在原始dbus库基础上对外广播数据  
dbus发送简单的uint已经调通了 可是怎么发送复杂的结构体还没有头绪

出0入0汤圆

发表于 2015-11-20 10:54:36 | 显示全部楼层
struct data  tagData;

dbus[0]=tagData.a;
dbus[1]=tagData. buf[0];
dbus[2]=tagData. buf[1];
dbus[3]=tagData. buf[2];

大体意思。。。看看行吗?

出0入0汤圆

 楼主| 发表于 2015-11-23 15:55:14 | 显示全部楼层
Excellence 发表于 2015-11-20 10:54
struct data  tagData;

dbus[0]=tagData.a;

不大明白您的意思

我的代码是这样写的 但是这样会出现段错误 在dbus_message_iter_append_fixed_array这个位置

  1. DBusMessageIter datatoSendIter;       // DBus数据迭代器
  2. DBusMessageIter subStructIter;
  3. dbus_bool_t boolArg = true;             // 要传送的bool变量
  4. char strArg[] = "I am a string";        // 要传送的字符串
  5. DBusMessageIter subArrayIter;

  6. int buf[11];
  7. char tmp[2];
  8. tmp[0] = DBUS_TYPE_INT16;
  9. tmp[1] = '\0';
  10. int i;
  11. int len = 11;

  12. for(i = 0; i < len - 1; i++)
  13. {
  14.         buf[i] = i + 1;
  15. }
  16. buf[i] = '\0';
  17. printf_data_as_hex(buf, len);

  18. dbus_message_iter_init_append(dbmsg, &datatoSendIter);    // 将迭代器绑定至消息

  19. dbus_message_iter_open_container(&datatoSendIter, DBUS_TYPE_STRUCT, NULL, &subStructIter);

  20. dbus_message_iter_append_basic(&subStructIter, DBUS_TYPE_BOOLEAN, &boolArg);         // 将bool变量append为第一个

  21. char *buff = strArg;           // 对于一些编译器,声名为char strArg[]的strArg无法通过DBus,故需要这一步

  22. dbus_message_iter_append_basic(&subStructIter, DBUS_TYPE_STRING, &buff);
  23. // 将字符串append为第二个         由于数组不是基本类型,无法用*_append_basic函数来append,需开启新的子迭代

  24. dbus_message_iter_open_container(&subStructIter,  DBUS_TYPE_ARRAY, tmp,  &subArrayIter);

  25. dbus_message_iter_append_fixed_array(&subArrayIter, DBUS_TYPE_INT16, &buf, len);

  26. //最后要关闭子迭代,实际上是将子迭代的数据加载到了父迭代器上

  27. dbus_message_iter_close_container(&subStructIter, &subArrayIter);
  28. dbus_message_iter_close_container(&datatoSendIter, &subStructIter);


  29. dbus_connection_send (dbconn, dbmsg, NULL);
复制代码

出0入0汤圆

 楼主| 发表于 2015-11-24 14:21:59 | 显示全部楼层
别沉呀~~~~~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 22:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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