【问题标题】:How to copy a binary string to and from a structure, in C.如何在 C 中将二进制字符串复制到结构中或从结构中复制出来。
【发布时间】:2013-05-25 02:34:03
【问题描述】:

我有一个可执行文件,它是一个应该跟随一行的小机器人,我的工作是编写 C 代码来命令它。我的问题是从机器人程序本身获取数据并将其发回。

指令以 8 位二进制代码传回第四次给软件,我有这两种结构来处理数据。

typedef struct
{
    unsigned speed:4;
    unsigned inv_right_wheel:1;
    unsigned right_wheel:1;
    unsigned inv_left_wheel:1;
    unsigned left_wheel:1;
} INPUT;

typedef struct
{
    unsigned char unused:2;
    unsigned char capt_left:1;
    unsigned char capt_right:1;
    unsigned char cont_back_right:1;
    unsigned char cont_front_right:1;
    unsigned char cont_back_left:1;
    unsigned char cont_front_left:1;
} OUTPUT;

为了找到二进制代码的地址,我有一个类似REGISTER(0xE001)(它的类型是static volatile unsigned char * REGISTER(unsigned short address))的小函数,它返回要查找的地址。

我的主要看起来像这样:

int main() { 
    OUTPUT  *out;
    INPUT   *in;

    out = REGISTER(0xE001);


    printf("%d", out.capt_left);
    return EXIT_SUCCESS;

}

【问题讨论】:

  • 什么不起作用?该代码甚至无法编译 - out 是一个指针,所以至少你需要 out->capt_left
  • 您能否详细说明“无法工作”部分?代码是否编译?你有编译错误吗?如果它运行,你会在调试器下看到什么?
  • 编者注:使用位域可能会以泪水告终。

标签: c struct binary


【解决方案1】:

嵌入式乐趣。如果你想让机器人与你交流,它必须有某种 API 或注册它使用。现在,系统寄存器 0x​​E001 是它告诉你输出的地方。如果这个寄存器是读/写的,你可以这样做:

out->capt_left = 1;

如果您通过 INPUT 进行通信(这样认为是合乎逻辑的),您需要找到 INPUT 寄存器所在的位置。这将在您的文档中某处。你会这样做:

in = (REGISTER(0xE000));   // Guessing on Register location.
in->speed = 1;
...

这是否让您知道从哪里开始?顺便说一句,您很有可能希望一次将整个字节写入输入,这样:

INPUT buffer;

buffer.speed = 1;
buffer.inv_right_wheel = 0;
...

*in = buffer;

甚至:

*(REGISTER(INPUT_REGISTER)) = 0x4F;  // Speed to 4, all other bits set true - maybe depending on bitfield order!

希望这会有所帮助!

【讨论】:

  • 谢谢@MattPhillips。我过去做过类似的事情,所以我想我知道他来自哪里:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2021-05-21
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多