一站式电子元器件采购平台

华强商城公众号

一站式电子元器件采购平台

元器件移动商城,随时随地采购

华强商城M站

元器件移动商城,随时随地采购

半导体行业观察第一站!

芯八哥公众号

半导体行业观察第一站!

专注电子产业链,坚持深度原创

华强微电子公众号

专注电子产业链,
坚持深度原创

电子元器件原材料采购信息平台

华强电子网公众号

电子元器件原材料采购
信息平台

arduino串口发送数据类型有哪些

来源:http://www.elecfans.com/emb/582037.html 发布时间:2017-11-20

摘要: [导读] Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。那么Arduino串口发送的数据类型类型有哪些?

  一、Arduino简介

  Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。由一个欧洲开发团队于2005年冬季开发。其成员包括Massimo Banzi、David CuarTIelles、Tom Igoe、Gianluca MarTIno、David Mellis和Nicholas ZambetTI等。

  它构建于开放原始码simple I/O介面版,并且具有使用类似Java、C语言的Processing/Wiring开发环境。主要包含两个主要的部分:硬件部分是可以用来做电路连接的Arduino电路板;另外一个则是Arduino IDE,你的计算机中的程序开发环境。你只要在IDE中编写程序代码,将程序上传到Arduino电路板后,程序便会告诉Arduino电路板要做些什么了。

二、Arduino功能

  可以快速使用Arduino与Adobe Flash, Processing, Max/MSP, Pure Data, SuperCollider等软件结合,作出互动作品。 Arduino可以使用现有的电子元件例如开关或者传感器或者其他控制器件、LED、步进马达或其他输出装置。 Arduino也可以独立运行,并与软件进行交互,例如: Macromedia Flash, Processing, Max/MSP, Pure Data, VVVV或其他互动软件。 Arduino的IDE界面基于开放源代码,可以免费下载使用,开发出更多令人惊艳的互动作品。

三、Arduino的数据类型

arduino串口发送数据类型有哪些

四、Arduino通过串口发送结构体

  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函数都无法直接发送结构体数据,因为结构体是用户自己的定义的,无法像其他数据那样有固定的格式或大小。所以我们必须将结构体转为字节数组,这样就可以通过write函数发送了,下面提供两种方法实现转换。

  方法一:使用memcpy函数,将结构体中的数据拷贝到一个字节数组中

  sdata s;

  。。。。。。

  byte b[sizeof(sdata)];

  memcpy(b,&s,sizeof(sdata));

  Serial.write(b,sizeof(sdata));

  方法二:用一个字节类型的指针强制指向结构体首地址

  sdata s;

  。。。。。。

  byte *tobyte=(byte*)&s;

  Serial.write(tobyte,sizeof(sdata));

  两种方法在Arduino都测试过,都能成功发送。

  接收到这些数据时都是字节流,一般存储在缓冲字节数组中,如果想转换成原始的结构体,我们同样可以用memcpy,用法同上,只是源和目标换了位置。

  最后再说一点,如果结构体很大,数据很多,那么结构体没有赋值前数据是不确定的,为了避免不确定数带来的问题,我们该怎么初始化这个结构体呢?一条一条赋值可以,但是很麻烦。如果要求不高,把结构体内的数据全部置零也算是一种初始化吧,用memset函数可以将目标地址内的数据全部置为指定的数据。不知道还有没有其他更好的方法,如果有知道的希望能交流交流。

五、Arduino-串口函数Serial:

  串口是Arduino与其它设备进行通信的接口,我们需要很好的掌握它的使用。Arduino串口使用相关的函数共有10个(随着版本的升级,新版本则加入了更多。

  Serial.begin(); //开启串行通信接口并设置通信波特率

  Serial。end(); //关闭通信串口

  Serial.available();//判断串口缓冲器是否有数据装入

  Serial。read(); //读取串口数据

  Serial.peek(); //返回下一字节(字符)输入数据,但不删除它

  Serial.flush(); //清空串口缓存

  Serial.print(); //写入字符串数据到串口

  Serial.println(); //写入字符串数据+换行到串口

  Serial.write(); //写入二进制数据到串口

  Serial.SerialEvent();//read时触发的事件函数

  Serial。readBytes(buffer,length);//读取固定长度的二进制流

  Serial.println(incomingByte, DEC);//打印接到数据十进制表示的ascii码。 HEX 十六进制表示

  peek():功能类似于read(),但是我们知道当调用一次read()后,缓冲区的数据流会被读取并删除read过的数据,也就是available值会减少,但peek()不会出现类似情况,其功能类似于检测缓冲区的头部数据,反复调用peek()返回的值是一样的。用得好的话可以精简很多代码。

  write():写入二进制数据到串行端口。这个数据是作为一个字节或字节序列发送的。如果发送字符串则需要用到print方法。

  最后注意一下:当烧程序入板卡的时候,在完成前即L、TX、RX灯闪烁前,断开数据线很可能损坏硬件。同时测试前养成按一次reset键复位的习惯,这里特别注意,在打开串口监视器后,需要reset一次,否则无法看到效果。

了解更多相关设计技术信息,请点击华强旗舰电子圈(http://www.hqbuy.com/dzq/dzqsy.html)!

声明:本文观点仅代表作者本人,不代表华强商城的观点和立场。如有侵权或者其他问题,请联系本站修改或删除。

社群二维码

关注“华强商城“微信公众号

调查问卷

请问您是:

您希望看到什么内容: