将C代码移植到Arduino平台(struct和typedef定义中的错误)

时间:2012-03-21 09:19:29

标签: c struct typedef arduino

我有一个工作的跨平台Visual Studio Windows C控制台应用程序源。该应用程序使用串行接口与RFID阅读器通信。我想把它移植到微控制器上,无需PC即可启动阅读器。为此我决定使用Arduino。它使用C / C ++语法。在下面的代码中,Arduino IDE编译器给出了错误。错误是 “错误:预期`)'''''令牌”之前。

/* A typedef that should be used for RFID radio handles */
typedef HANDLE32    RFID_RADIO_HANDLE;

/******************************************************************************
 * Name: RFID_PACKET_CALLBACK_FUNCTION
 *
 * Description:
 *   The tag-protocol operation response packet callback function signature.
 *
 * Parameters:
 *   handle - the handle for the radio for which operation response packets are
 *     being returned
 *   bufferLength - the length of the buffer that contains the packets
 *   pBuffer - a buffer that contains one or more complete operation response
 *     packets
 *   context - an application-defined context value that was supplied when the
 *     the original tag-protocol operation function was invoked
 *
 * Returns:
 *   0 - continue making packet callbacks
 *   !0 - cancel the tag-protocol operation and stop making callbacks for that
 *
 *   The return value of the last packet callback for the tag-protocol operation
 *   is returned to the application if the application indicates the desire for
 *   this value when it invokes the tag-protocol opreation.
 ******************************************************************************/
typedef INT32S (RFID_CALLBACK * RFID_PACKET_CALLBACK_FUNCTION)(
    RFID_RADIO_HANDLE   handle,
    INT32U              bufferLength,
    const INT8U*        pBuffer,
    void*               context
    );

它在visual studio中工作,所以它的语法应该是正确的。我不知道如何解决这个错误。

我在下面的代码中有另一个错误。这个标题中有很多结构定义。我给出了一小部分错误。错误是“错误:'RFID_PACKET_CALLBACK_FUNCTION'未命名类型”

.
.
.
...
typedef struct {
    INT32U                 tagStopCount;
    RFID_PACKET_CALLBACK_FUNCTION           pCallback;
    void*                     context;
    INT32S*                 pCallbackCode;
} RFID_18K6C_COMMON_PARMS;

typedef struct {
    INT32U                  length;
    INT32U                  command;
    RFID_PACKET_CALLBACK_FUNCTION           pCallback;
    void*                      context;
    INT32S*                  pCallbackCode;
} RFID_ISSUE_RADIO_COMMAND_PARMS;

typedef struct {
    INT32U                  length;
    INT32U                  duration;
    RFID_PACKET_CALLBACK_FUNCTION           pCallback;
    void*                      context;
    INT32S*                  pCallbackCode;
} RFID_RANDOM_CW_PARMS;
.
.
.
...

这些代码都在VS控制台应用程序中运行。我能为Arduino平台做些什么?

2 个答案:

答案 0 :(得分:4)

您的第一个问题是typedef的{​​{1}}的函数指针语法不正确。这一点:

RFID_PACKET_CALLBACK_FUNCTION

应定义函数类型,但给定的代码不是有效的类型标识符。它在Visual Studio中工作的事实并不能保证语法的正确性,因为编译器编写者几乎总是支持语法扩展来控制神秘的功能,而且微软肯定会对此感到内疚。但是在这种情况下,它看起来不像编译器特定的东西,我猜有一个头文件在某处执行条件(RFID_CALLBACK * RFID_PACKET_CALLBACK_FUNCTION) ,这在Arduino环境中没有正确发生。 (Arduino不是正确的C,它的预处理器reportedly没有完全显示。)

你的第二个问题只是第一个问题的结果,因为如果#define RFID_CALLBACK ...失败,那么typedef确实没有命名类型。

正如freespace所指出的那样,你可以轻松地将代码从桌面操作系统移植到一个极小的Arduino而不必做一些认真的工作。

答案 1 :(得分:3)

你不能简单地走进Mordor ......等不,错误的幻想。

您不能简单地获取旨在在功能齐全的操作系统中运行的应用程序的源代码,并期望它能够在嵌入式平台上神奇地工作,该平台不仅具有完全不同的架构和设计,而且还极其有限。硬件资源。

您需要做的是阅读源代码并了解如何与RFID读卡器进行通信。获得这些知识后,您需要学习如何使用Arduino软件环境或通用AVR环境对Arduino进行编程。

有了上述知识,您就可以在Arduino平台上实现所需的通信协议。

此外,您很可能需要学习一些基本的电子设备,以及正确执行电平转换以符合RS-232串行标准所需的电子设备。

这是你的任务。祝你好运。