Arduino通过串口发送结构体

本文介绍了如何在Arduino中通过串口发送自定义结构体数据。由于结构体在不同环境下大小可能不同,文章讨论了地址对齐问题,并提供了两种方法将结构体转换为字节数组以便通过`Serial.write()`函数发送。接收到字节流后,可使用`memcpy`函数将其还原为结构体。对于大型结构体的初始化,建议使用`memset`函数将其置零。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    Arduino的串口有两类发送的函数Serial.print()类和Serial.write()类,前者以Ascii码的形式将要发送的内容编码发送,所以我们最后接收并看到的是一个一个的ASCII码组合而成的数据,本质上成了字符串;后者则以字节形式直接发送原始数据,所以我们在串口接收工具看到的数据是乱码,它们在计算机中就是这样存储的。

    有些时候,我们可能会自己定义数据结构,比如结构体类型的数据。结构体由一些基本的数据类型组合而成,用户可以自由添加和安排其内容,但是在自己实验和查阅资料了解到,在单片机中和在电脑中定义的结构体有一些区别。我们以下面的结构体为例。

typedef struct sdata
{
    char  c;
    int16_t  i;
    float   f;
}sdata;

    如果按照Arduino的数据类型大小来算,为1+2+4=7,通过sizeof(sdata)验证后也为7;而如果这个结构体定义在linux操作系统下,用sizeof(sdata)算出来的结果为8,这涉及到计算机地址对齐的问题,具体请参考文章:http://blog.sina.com.cn/s/blog_5f77c7270100dnoy.html。知道了上面的问题,我们设计结构体就要注意,不同的数据类型顺序可能会导致不同的结构体大小,而我们在单片机如Arduino设计结构体时也要考虑对齐问题,比如将上面例子的char定义为二维数组char c[2],或者把char放到最后,这样即使我们接收时弄错了结构体大小,接到的数据也能够准确的放到结构体中。

    在Arduino中,print函数和write函数都无法直接

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值