Arduino—串口通讯与IIC

1.串口通信

单片机的第五大功能——串口通讯,它可以建立起你的电脑和单片机直接的连接,也可以是其他模块的连接,比如蓝牙,WIFI等,接口都是串口,另一部分的模块,接口时IIC或者SPI,比如陀螺仪一般都是IIC,OLED显示,接口也是IIC

在物理上,串口通信需要三根线 TX RX GND,TX是发送,RX是接受 GND是接地,看看原理图
在这里插入图片描述
在这里插入图片描述
我们看到,RX RT经过一个USB芯片,把串口转换成了USB口,所以插到我们的USB线就是个串口和供电的功能(注意使用的是数据线还是电源线,电源线是无法出现COM口的),我们的电脑会出现一个虚拟的COM口

串口有两个功能,第一个功能是将数据发送出去,第二个功能是接收外面来的数据,而发送进来的数据是一串16进制的数组,比如 55 77 03 05 9A B4 FF FF,这串数组的意思,我们有个学名,叫做协议,也叫做通信协议 ,所谓通讯协议就是通讯双方所约定的数值的含义,也就是说发这串数据,每个16进制数所代表的含义,一般情况下,我们制定协议的时候是这样的,以上一个例子为例,5577代表开始,03 05 78 9A B4,这五个数据代表五个参数,当然了,具体什么参数是根据具体的需要来定的,最后两个ff ff是表示结束,那么如果我们双方约定好了这样一个协议,那么我发什么你接收到之后,你也知道每一个字段所代表的含义了,如果我不知道双方的协议呢,我就很难介入到你们的通信当中去,比如说我要维修一个设备,这两个设备之间呢是用串口进行通讯的,

那么我能监听到他们通讯的内容,也能把他们通讯的16进制数都写出来,但是我不知道他们所表示的含义,这个只有设备的生产商才知道,这种协议的我们称之为私有协议。

有些协议是公开的,为了方便各个厂家的设备进行对接,只要大家都遵循同样一个协议,那么我们的设备就可以互相通讯,所以大公司的产品一般都遵循一个标准协议。

那么讲到串口通讯,我们还需要讲一个概念,就是通讯的波特率,所谓的波特率,就是一秒钟发送数据的位数,通讯是两个设备之间的事情,那么他们的频率必须保持一致。一般我们用的波特率是9600,波特率越低发送的速度越慢,波特率越高发送的数据越快,有可能会出问题

int incomedate = 0;
void setup() {
 
  Serial.begin(9600); //设置串口波特率9600
}
void loop() {
 
  if (Serial.available() > 0)//串口接收到数据
  {
    incomedate = Serial.read();//获取串口接收到的数据
    if (incomedate == 'a') // 判断我们所接收到的字符
    {
      Serial.println("ko no dio da!");串口监视器里看打印出的东西
    }
  }
 
  delay(1000);//循环延时一秒打印
 
}

我们来介绍一下上面的这些函数

  • Serial.begin(speed) 定义我们的波特率
  • int Serial.available() 判断缓冲器状态,返回接受到字节数
  • int Serial.read() 读取串口并且返回收到数据(也就是我们要我们所设置的东西,给他赋值赋这个)
  • Serial.flush() 清空缓冲器
  • Serial.print(data) 串口输出数据,data可以是任何数据类型
  • Serial.println(data) 串口输出数据并且带回车符(空行)

我们再来梳理一下整个过程,单片机一开始什么事情也不做,就在那等待,当我的电脑发送一个数据给单片机的时候,单片机来接收并判断这个数据,如果是我想要的数据,那么我就做选择分支去做一件事情。我们这里做的事情是反馈一个字符串出去,如果不是,我们也可以让他去做另一个事情,利用这个特性,我们就可以进行我们的远程点灯

比如我们在我们的判断语句里加入点灯,这样我们接受到我们想要的数据后就可以,点亮灯了

接下来是我们的IIC通信
代码来源于 huanghaoAudio

//I2C主机
#include <Wire.h>
#define LED 13
 
//初始化
void setup()
{
  Wire.begin(); //主机
  pinMode(LED,OUTPUT);
  Serial.begin(115200); 
}
//主程序
void loop()
{
  Wire.beginTransmission(4); //发送数据到设备号为4的从机
  Wire.write("OFF");        // 发送字符串
  Wire.endTransmission();    // 停止发送
  request();               //回复状态
  delay(1000);
 
  Wire.beginTransmission(4); 
  Wire.write("ON");        
  Wire.endTransmission();  
  request();
  delay(1000);
    
 
}
void request()
{
    delay(10);
    Wire.requestFrom(4, 2);    //通知4号从机上传2个字节
  String c;
  while(Wire.available()>0)    // 当主机接收到从机数据时
  { 
   c += char(Wire.read());   
  }
    Serial.print(c);
    if(c=="OK"){digitalWrite(LED,HIGH);}
    else {digitalWrite(LED,LOW);}
}
//I2C从机
#include <Wire.h>
#define LED 13
bool LED_STA;//记录LED状态
//初始化
void setup()
{
  Wire.begin(4);                // 加入 i2c 总线,设置从机地址为 #4
  Wire.onReceive(receiveEvent); //注册接收到主机字符的事件
  Wire.onRequest(requestEvent); // 注册主机通知从机上传数据的事件
  pinMode(LED,OUTPUT);//设置数字端口13为输出
  Serial.begin(115200);           //设置串口波特率
}
//主程序
void loop()
{
  delay(100);//延时
}
 
// 当从机接收到主机字符,执行该事件
void receiveEvent(int a)
{
  String c;
  while( Wire.available()>0) // 
  {
    c += char(Wire.read()); // 作为字符接收字节
  }
   Serial.print(c);         // 把字符打印到串口监视器中
    if(c=="ON"){LED_STA = 1; digitalWrite(LED,HIGH);}//记录LED状态
    if(c=="OFF"){LED_STA = 0;digitalWrite(LED,LOW);}
 
}
 
//当主机通知从机上传数据,执行该事件
void requestEvent()
{
  if(LED_STA == 1){Wire.write("OK"); }//如果灯已经亮了 回复OK
  else {Wire.write("NO");}
}

————————————————
版权声明:本文为CSDN博主「ArtoriaLili」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ArtoriaLili/article/details/121723604

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
K210是一款由中国芯片设计公司寒武纪(Kendryte)推出的高性能人工智能处理器。它采用RISC-V架构,拥有双核心处理器和硬件神经网络加速器,适用于各种人工智能应用场景。 Arduino是一种开源的电子原型平台,它提供了易于使用的硬件和软件工具,使用户可以快速搭建各种电子项目。 要实现K210与Arduino之间串口通讯,你可以按照以下步骤进行操作: 1. 硬件连接:将K210的串口引脚(TX、RX)与Arduino的对应串口引脚(一般为D0和D1)相连。同时,确保两者共享相同的地线(GND)。 2. 软件设置: - 在Arduino IDE中选择正确的开发板类型和串口端口。 - 在Arduino代码中使用Serial对象来进行串口通讯。例如,使用Serial.begin()函数初始化串口,并使用Serial.print()或Serial.write()函数发送数据。 - 在K210的代码中,使用UART接口来进行串口通讯。你可以使用Kendryte提供的开发工具链(如Kendryte Standalone SDK)来编写代码,并使用UART相关函数进行串口通讯。 3. 数据传输:通过串口发送和接收数据。你可以在Arduino代码中使用Serial.print()或Serial.write()函数发送数据,然后在K210的代码中使用UART接口接收数据。同样地,你也可以在K210的代码中使用UART接口发送数据,然后在Arduino代码中使用Serial.read()函数接收数据。 请注意,确保两者的串口参数(如波特率、数据位、停止位等)设置一致,以确保正确的数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值