【问题标题】:Struct to uint8 Casting [closed]结构到uint8铸造[关闭]
【发布时间】:2020-11-05 13:07:24
【问题描述】:

我有一个通过 SCI 协议传输 256 字节数据的串行端口。

帧格式如下:

  typedef struct
  {
     int header;
     uint8 ssap;
     uint8 dsap;
     uint8 data[248];
  }Frame;

并具有以下功能

  void sciSendStream(int length, uint8* data);

我的问题是如何将Frame struct 转换为uint8 *

当我尝试使用以下演员来做到这一点时:

  sciSendStream(256,(uint8 *)frame);

我收到不兼容的转换错误。

【问题讨论】:

  • @Jabberwocky Doh!
  • 什么是“SCI协议”?我所知道的唯一 SCI 是摩托罗拉的 UART 硬件名称。
  • void sciSendStream(int length, uint8* data); 应该有 int sciSendStream(const size_t length, const void *data); 原型,如果它是由理智的程序员编写的。
  • @Lundin 是的,是一种UART协议
  • 不,它不是一个协议,它是你MCU中的一块硬件。

标签: c struct casting


【解决方案1】:

您无法将frame 转换为uint8*,因为frame 不是指针而是Frame。但是您可以使用& 运算符将frame(它是一个指针)的地址转换为uint8*

只需替换:

sciSendStream(256, (uint8*)frame);

与:

sciSendStream(256, (uint8*)&frame);`. 

我假设unint8unsigned char

【讨论】:

  • Frame 的第一个成员是int,因此您将int 转换为uint8。这是有意的/合法的吗?
  • 更好sciSendStream(sizeof(Frame), (uint8*)&frame);
  • @StephanLechner,实际上它只是将指针转换为另一种完全合法的指针。
  • @P__JsupportswomeninPoland const uint8_t* 优于 const void* 的优势在于类型安全。你可以在const uint8_t*上使用指针算法,这意味着它可以被当作一个数组来对待。
  • @P__JsupportswomeninPoland 这不是实际的指针转换,而是当您取消引用 void 指针指向的任何内容时。然后你会立即得到关于大小、对齐、指针别名、陷阱表示等的各种担忧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多