【问题标题】:Can-Bus Communication - MSG-Structure (WinUser.h) Linux equivalentCan-Bus 通信 - MSG-Structure (WinUser.h) Linux 等效
【发布时间】:2015-07-29 22:30:35
【问题描述】:

你好 StackOverflow 社区

我已经搜索了很长时间,但没有找到解决问题的方法。 我现在正在做一个项目,我必须将 Windows 工具移植到 Linux 操作系统(具体来说是 Ubuntu 12.04LTS)。 基于 Windows 的工具是用 C++ 编写的,因此我试图在 Linux 上用 C++ 重写该工具。 我目前面临的问题是,在 Windows 解决方案中有一部分使用“MSG”。 这里是来自 Windows 解决方案的代码片段:

/** Callback to send CAN message */
#define CB_SEND_MSG( MSG )          CanWriteCB( MSG )

我已经实现了 CanWriteCB 方法,但我没有找到与“MSG”等效的 Linux。我在包含文件“WinUser.h”的 Windows 工具中找到了 MSG 的声明。如下所示:

/*
 * Message structure
 */
typedef struct tagMSG {
    HWND        hwnd;
    UINT        message;
    WPARAM      wParam;
    LPARAM      lParam;
    DWORD       time;
    POINT       pt;
#ifdef _MAC
    DWORD       lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;

我不知道它是否对你有帮助,但这也是“CanWriteCB”方法的实现:

boolean_t CanWriteCB( Can_Msg *msg )
{
    return (CanDispatcher_SendMsgByCanBus( msg ) == CanDisp_Err_Ok ) ? TRUE : FALSE;
}

const Det_Config detCfg = 
{
WriteDebugErrorData
};

有人知道如何在 Linux 平台上实现这种结构吗?我发现的唯一一件事是如何创建消息队列,但我完全不知道这对我有什么帮助?

感谢您的宝贵时间

最好的问候 亚历克斯

【问题讨论】:

  • MSG 在发布的代码中甚至不是类型名称 - 它是宏参数名称。也可能是x
  • 我知道。问题是,当我右键单击“MSG”以检查“MSG”的定义时,我会被重定向到我在上面的 WinUser 头文件中发布的 CodeSnippet。因此,我认为这两者之间肯定存在关系。我真的需要这个宏吗?它不是比只调用 CanWriteCB 函数而不是宏更复杂吗?或者如果我这样做,整个项目会被搞砸吗?
  • 您的 IDE 误导了您。您不应该尝试获取 MSG 的定义 - 它只是一个宏参数名称。它不是类型,它没有定义。
  • 所以最后它只是一个“错误”,它向我展示了 WinUser.h 中的定义,并且它只是“偶然”具有相同的名称并且根本不相关。这一点很好,但没有回答,为什么我的 IDE(顺便说一句。Eclipse)向我显示 MSG 尚未声明的错误消息?也许我完全走错了路,只是没有得到简单的解决方案。我在 cmets 中问的另一个问题呢?如果我只在需要的地方调用函数,它会以同样的方式工作吗?还是宏背后有某种魔力?顺便谢谢大家的支持!

标签: c++ linux windows porting can-bus


【解决方案1】:

你提到的MSG是一个宏参数,和struct tagMSG一点关系都没有。

Linux 支持使用SocketCAN 实现CAN 总线的套接字接口,并支持各种硬件设备。最接近 CAN 消息结构的是struct can_frame

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    相关资源
    最近更新 更多