【问题标题】:C programming UART function incompatible pointer typeC编程UART功能不兼容指针类型
【发布时间】:2014-05-09 15:57:59
【问题描述】:

我正在使用以下 C 库文件尝试通过 UART 发送 9 个浮点值: https://github.com/microbuilder/LPC1343CodeBase/blob/master/core/uart/uart.c

按照 cmets 中的示例,我想出了以下代码:

#define UARTBUFFERSIZE 36 
float testVals[9] = {0.1, 0.2, 0.3, 0.5, 0.6, 0.7, 0.8, 0.9}; //global, just for testing

在我的主代码中,我有以下行来尝试发送 testVals:

uartSend((float *)testVals, UARTBUFFERSIZE); 

main.c:94:4: warning: passing argument 1 of 'uartSend' from incompatible pointer type
core/uart/uart.h:67:6: note: expected 'uint8_t *' but argument is of type 'float *'

我是否必须使用 'uint8_t' 类型,这样我可以发送浮点值吗?

【问题讨论】:

  • 不清楚为什么要尝试从 float[] 显式转换为 float * - 相反,您可能希望从 float[] 显式转换为 uint8_t * 到 in效果说“是的,我知道我在做什么”。您确实需要注意元素大小的差异,但您似乎正在处理这个问题。
  • 好吧,我并不是 100% 了解自己在做什么,但我想根据给定的答案,事情似乎还不错。谢谢。
  • 仅供参考,您只初始化了 testVals 数组的 8 个值。 (在您的序列中错过了 0.4 个。)
  • 哈哈谢谢,好收获。
  • 小心字节序问题。

标签: c arrays floating-point embedded


【解决方案1】:

只需将其投射到uint8_t*,它是安全的。您的浮点数设置正确 9 个浮点数 -> 9 x 4 字节。

【讨论】:

  • @JDS:顺便说一句,在进行嵌入式编程时,您需要记住所有通信机器上的endian differences 和浮点表示(usually IEEE 754)。这意味着有时强制转换是不够的,但您必须手动重新排列字节以匹配目标系统的架构。
  • @Groo 你永远不应该遵守目标架构。接收方只需知道发送方的顺序,然后使用两种不同的方法。
  • 为什么您认为您可以控制其他设备?还是协议? “发送者”和“接收者”不是相对术语吗?如果您的设备使用特定协议 接受数据,则必须遵守该期限。通过 UART 传输浮点数听起来像是检查另一端的正确情况。我什至不确定在哪种情况下“不应该符合目标架构”的理念会起作用?您只是开始通过网络发送您的本机数据,而忽略其他设备的期望?
  • @Groo 您指定字节顺序并发送数据。您不需要知道目标字节序。接收器获取数据并进行适当的转换。 (下次请问一个问题)
  • 我感觉我们在谈论不同的事情。您向谁指定字节顺序?哦,很抱歉写了这么多,我认为这将有助于澄清我的推理。你的答案和 cmets 都很短,所以我觉得它会加快速度。嗯,第一个问题可能是最重要的:为什么您认为您可以控制其他设备(或协议)?
猜你喜欢
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 2013-11-06
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多