精华内容
下载资源
问答
  • Arduino使用多个串口的方法

    千次阅读 多人点赞 2020-02-27 15:45:16
    如果想要给Arduino UNO R3同时接上WiFi模块和蓝牙模块时,但是Arduino的串口只有一个,怎样才能让Arduino同时使用多个串口呢? 解决方案 其实Arduino官方提供了一个串口的库SoftwareSerial,不需要额外的去库管理...

    问题

    如果想要给Arduino UNO R3同时接上WiFi模块和蓝牙模块时,但是Arduino的串口只有一个,怎样才能让Arduino同时使用多个串口呢?
    Arduino唯一的串口.png

    解决方案

    其实Arduino官方提供了一个软串口的库SoftwareSerial,不需要额外的去库管理面板中导入,只需一句include语句就可以使用它

    #include <SoftwareSerial.h>
    

    这个库可以将Arduino的引脚,通过程序模拟成串口来使用;
    在声明语句中使用

    SoftwareSerial mySerial(2,3);
    

    便创建了一个自定义的软串口mySerial,并把数字引脚2定义成RX,数字引脚3定义成TX

    实验验证

    我们现在通过实验验证软串口是否有效;让蓝牙模块的TXD和RXD接在Arduino的D2、和D3上,通过手机蓝牙串口调试助手发送数据给HC-05模块,如果软串口有效则成功控制舵机;
    软串口测试.png

    代码
    #include<Servo.h>
    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(2,3); //定义D2、D3分别为TX、RX
    Servo myservo;
    int pos = 0;
    
    void setup()  
    {  
     mySerial.begin(9600);  //以9600波特率打开软串口
     myservo.attach(9); //舵机控制引脚9
     myservo.write(0);
     delay(10000);
    }  
    
    void loop()  
    {   
       while(mySerial.available())  
       {  char c;
          c=mySerial.read();
          mySerial.println (c);
          switch(c){
            case '2':open_the_door();
            break;
            }
       }
       
    }
    
    void open_the_door(){
        for (pos = 0; pos <= 180; pos += 1) { 
        myservo.write(pos);            
        delay(5);                       
      }
    }
    
    

    测试结果

    软串口通信唤醒舵机.gif

    手机蓝牙连接上HC-05模块后,发送字符串,成功控制舵机

    最后

    使用软串口,有两点好处;好处一:arduino就可以同时使用蓝牙模块和WiFi模块,再也不用为串口不够用而发愁了!好处二:使用软串口连接,就不用担心烧录程序时的串口干扰问题了,如果经常使用串口连接蓝牙或者WiFi模块的人绝对深有体会,再也不用烧录一次程序就要拔一次杜邦线了。

    展开全文
  • 刚好过完年到现在没有写博客, 贴点很久以前的东西骗点...类似于Arduino Uno, 只有一个串口Arduino板子, 并不妨碍我们读取TFmini的数据, 只需要连接TFmini的TX到Arduino的RX即可, 不影响Arduino的TX向PC发数据, ...

    刚好过完年到现在没有写博客, 贴点很久以前的东西骗点阅读量…

    TFmini是北醒光子的一款Lidar, 卖的很不错.

    TFmini_Arduino_HardwareSerial_Polling

    类似于Arduino Uno, 只有一个串口的Arduino板子, 并不妨碍我们读取TFmini的数据, 只需要连接TFmini的TX到Arduino的RX即可, 不影响Arduino的TX向PC发数据, 连接方式如下:

    在这里插入图片描述

    TFminiArduino
    5V(红)5V
    GND(黑)GND
    TX(绿)0(RX)

    采用轮询的方式, 代码如下:

    void getTFminiData(int* distance, int* strength) {
      static char i = 0;
      char j = 0;
      int checksum = 0; 
      static int rx[9];
      if(Serial.available()) {  
        rx[i] = Serial.read();
        if(rx[0] != 0x59) {
          i = 0;
        } else if(i == 1 && rx[1] != 0x59) {
          i = 0;
        } else if(i == 8) {
          for(j = 0; j < 8; j++) {
            checksum += rx[j];
          }
          if(rx[8] == (checksum % 256)) {
            *distance = rx[2] + rx[3] * 256;
            *strength = rx[4] + rx[5] * 256;
          }
          i = 0;
        } else {
          i++;
        } 
      }  
    }
    
    void setup() {
      Serial.begin(115200);
    }
    
    void loop() {
      int distance = 0;
      int strength = 0;
    
      getTFminiData(&distance, &strength);
      while(!distance) {
        getTFminiData(&distance, &strength);
        if(distance) {
          Serial.print(distance);
          Serial.print("cm\t");
          Serial.print("strength: ");
          Serial.println(strength);
        }
      }
    }
    

    注意下载程序的时候, 拔掉TFmini的TX, 下完程序后再插到Arduino的0(RX)上.


    TFmini_Arduino_HardwareSerial_Interrupt

    连接方式同上, 我们在串口事件中接收, 接收完成后, 在loop()中打印:

    int distance = 0;
    int strength = 0;
    boolean receiveComplete = false;
    
    void getTFminiData(int* distance, int* strength, boolean* complete) {
      static char i = 0;
      char j = 0;
      int checksum = 0; 
      static int rx[9];
      if(Serial.available()) {  
        rx[i] = Serial.read();
        if(rx[0] != 0x59) {
          i = 0;
        } else if(i == 1 && rx[1] != 0x59) {
          i = 0;
        } else if(i == 8) {
          for(j = 0; j < 8; j++) {
            checksum += rx[j];
          }
          if(rx[8] == (checksum % 256)) {
            *distance = rx[2] + rx[3] * 256;
            *strength = rx[4] + rx[5] * 256;
            *complete = true;
          }
          i = 0;
        } else {
          i++;
        } 
      }  
    }
    
    void setup() {
      Serial.begin(115200);
    }
    
    void loop() {
      if(receiveComplete) {
        receiveComplete = false;
        Serial.print(distance);
        Serial.print("cm\t");
        Serial.print("strength: ");
        Serial.println(strength);
      }
    }
    
    void serialEvent() {
      getTFminiData(&distance, &strength, &receiveComplete);
    }
    

    注意下载程序的时候, 拔掉TFmini的TX, 下完程序后再插到Arduino的0(RX)上.

    TFmini_Arduino_SoftwareSerial

    使用软件串口库, 来模拟一个串口. 连接方式如下:

    在这里插入图片描述

    代码参考 TFmini_Arduino_SoftwareSerial.

    下载程序, 运行即可.


    TFmini_Arduino_SoftwareSerial_Multiple

    listen轮询软件串口的方法, 连接多个TFmini, 只需要接TFmini的TX即可, RX悬空, 理论上几乎未被占用的数字IO每个都可以接一个TFmini.

    在这里插入图片描述

    代码参考 TFmini_Arduino_SoftwareSerial_Multiple.


    TFmini_Arduino_SoftwareSerial_Multiple_Frequency

    listen轮询软件串口的方法, 连接多个TFmini, 只需要接TFmini的TX即可, RX悬空, 理论上几乎未被占用的数字IO每个都可以接一个TFmini. 对上面的代码优化, 封装, 并且加上测试频率:

    #include <SoftwareSerial.h>  
    
    typedef struct {
      int distance;
      int strength;
      boolean receiveComplete;
    }TFmini;
    
    TFmini TFminiOne = {0, 0, false};
    TFmini TFminiTwo = {0, 0, false};
    
    //SoftwareSerial port(TX, RX);
    SoftwareSerial portOne(2, 2);
    SoftwareSerial portTwo(3, 3); 
    
    void getTFminiData(SoftwareSerial* port, TFmini* tfmini) {
      port->listen();
      while(tfmini->receiveComplete == false) 
      {   
        static char i = 0;
        char j = 0;
        int checksum = 0; 
        static int rx[9];
        if(port->available()) {  
          rx[i] = port->read();
          if(rx[0] != 0x59) {
            i = 0;
          } else if(i == 1 && rx[1] != 0x59) {
            i = 0;
          } else if(i == 8) {
            for(j = 0; j < 8; j++) {
              checksum += rx[j];
            }
            if(rx[8] == (checksum % 256)) {
              tfmini->distance = rx[2] + rx[3] * 256;
              tfmini->strength = rx[4] + rx[5] * 256;
              tfmini->receiveComplete = true;
            }
            i = 0;
          } else {
            i++;
          } 
        } 
      } 
    }
    
    void setup() {
      Serial.begin(115200);
      portOne.begin(115200);
      portTwo.begin(115200);
    }
    
    void loop() {
        static unsigned long lastTime = millis();
        static unsigned int count = 0;
        static unsigned int frequency = 0;
        
        getTFminiData(&portOne, &TFminiOne);
        getTFminiData(&portTwo, &TFminiTwo);
        
        if(TFminiOne.receiveComplete == true && TFminiTwo.receiveComplete == true) {
          ++count;
    
          if(millis() - lastTime > 999) {
            lastTime = millis();
            frequency = count;
            count = 0;
          }   
        
          Serial.print(TFminiOne.distance);
          Serial.print("cm\t");
          Serial.print("strength1: ");
          Serial.print(TFminiOne.strength);
          Serial.print("\t");
        
          Serial.print(TFminiTwo.distance);
          Serial.print("cm\t");
          Serial.print("strength2: ");
          Serial.print(TFminiTwo.strength);
          Serial.print("\t");
    
          Serial.print(frequency);  //40~70Hz, It maybe higher if we don't print other thing. 
          Serial.println("Hz");
          
          TFminiOne.receiveComplete = false;
          TFminiTwo.receiveComplete = false;
        }
    
     }
    
    

    结果如下:
    在这里插入图片描述

    TFmini_Arduino_I2C_1Master1Slave

    从设备Arduino Uno 的RX连接一个TFmini, 读取的数据通过TX传送到电脑上 并且 通过I2C(SCL和SDA引脚)发送出去. 主设备Arduino通过I2C(SCL SDA引脚)接收从设备传来的数据, 然后把数据通过串口传输到电脑. 连接方式如下:

    在这里插入图片描述

    代码参考 TFmini_Arduino_I2C_1Master1Slave, 其中, Slave程序下载给Arduino Uno, 注意下载程序的时候拔掉TFmini的绿线, 下完程序后再插到Uno的RX上. Master程序下载到Arduino Due中.

    读取的数据如下图:

    在这里插入图片描述

    左边是TFmini的100Hz数据, 右边是Due通过I2C读到的数据. 可以看到Due读取的有重复的数据, 可以稍微修改下程序, 使用millis()或者软件定时器把查询的频率也设成100Hz. 同样也可看出没有其它代码时, 如果保证不丢数据, I2C接4个TFmini比较合适, 超过4个可能造成频率有一定程度的下降.

    Github项目地址

    https://github.com/TFmini/TFmini-Arduino

    展开全文
  • arduino软串口库文件SoftwareSerial
  • Arduino虚拟串口软串口

    千次阅读 2018-04-16 09:07:57
    #include &... //定义虚拟串口名为serial,rx为6号端口,tx为7号端口 void setup() { serial.begin(9600); //初始化虚拟串口 Serial.begin(9600); //初始化Arduino默认串口 } char a; void loo...
    #include <SoftwareSerial.h>
    SoftwareSerial serial(6, 7); //定义虚拟串口名为serial,rx为6号端口,tx为7号端口
    void setup()
    {
      serial.begin(9600); //初始化虚拟串口
      Serial.begin(9600); //初始化Arduino默认串口
    }
    char a;
    void loop()
    {
      if (serial.available()) //虚拟串口的用法和默认串口的用法基本一样
      {
        a = serial.read();
        Serial.print(a);
      }
      /*
      serial.println("123,456");
      delay(1000);
      */
    }
    

    展开全文
  • 遇到需要2个串口的情况,其中一个串口失效了,获取不到数据。切换监听也写了,还是没有用。 硬件电路没有问题,换了另一个只用了一个软接口的代码后可执行。 新人学习中,求大神指导,我是不是遗漏了什么。 ``` ...
  • 个arduino进行软串口通信的探索 arduino1程序如下: #include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); void setup() { Serial.begin(9600); mySerial.begin(9600); } void loop() { if ...

    两个arduino进行软串口通信的探索

    arduino1程序如下:

    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(2, 3);

    void setup()
    {
      Serial.begin(9600);
      mySerial.begin(9600);
    }

    void loop()
    {
      
      if (Serial.available())
      {
        
        mySerial.write(Serial.read());
      }
      if (mySerial.available())
      {
        

        Serial.write(mySerial.read());//硬串口收到软串口数据


      }
    }

    arduino2程序如下:

    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(2, 3);

    void setup()
    {
      Serial.begin(9600);
      mySerial.begin(9600);
    }

    void loop()
    {
      if (Serial.available())
      {
        mySerial.write(Serial.read());
      }
      delay(3000);
      if (mySerial.available())
      {
        Serial.write(mySerial.read());

    }
    }

    硬件连线为:两块arduino均通过数据线连接电脑,且2,3口交叉连接。

    结果:arduino1的串口调试输入08后,就一直,输出08,arduino2串口调试器没有任何输出,但发送给arduino1的串口发送数据。

    arduino1的串口监视器

    arduino2的串口监视器

    思考:1、为什么arduino2的串口监视器 接收不到arduino1的数据?

              2、为什么arduino1的串口持续输出数据?

    展开全文
  • Arduino - 软串口

    万次阅读 2015-12-22 16:51:01
    软串口跟硬串口一样,只不过用了两数字IO口代替RX,TX。 【所用库文件】系统自带的 : SoftwareSerial 应用方法如下:#include <SoftwareSerial.h> //引用库文件 SoftwareSerial DLSerial(6, 7); // 定义软串口 RX...
  • Arduino多串口通信问题

    万次阅读 多人点赞 2018-08-13 15:22:41
    对于Arduino串口通信,主要有硬件串口软串口。当然硬件串口相对于软串口要...ArduinoMega有四硬件串口,想想也够用了吧,不过要是还不够用那就加软串口喽。 串口与引脚对应为: 0——Rxd0 1——-Txd0 ...
  • 用到的头文件 #include <SoftwareSerial.h> 硬件连接 软串口1: GPIO14(D5)————RX; GPIO12(D6)————TX;...基本流程:电脑发送数据——硬串口接受数据——软串口1发送硬串口数据——...
  • arduino uno 串口通信

    万次阅读 2015-07-14 22:55:36
    本次实验测试arduino uno 异机通过串口收发数据 选用两块arduino uno. 实验原型为一块uno作为主机,发送数据,另一块uno作为从机接收数据。 主机选用软串口发送数据(LIBRARY:softserial)测试程序: #include...
  • 但是一个串口有时候是不太够用的,所以需要其他串口。在Arduino开发中,可以通过下载库,把普通的GPIO口模拟成串口。在别人的教程中,需要下载一个软件模拟串口的库:SoftwareSerial.h。但是我不知道为什么实际上我...
  • 我的语音模块(tts)和无线模块 (syn6288-01)同时需要串口,而用软串口后并不能同时工作(之前使用uno),后来换了一块mega,有4组硬串口,然后还是无济于事。只有放在串口0的模块可以工作,其他不起作用。。 ...
  • Arduino RTOS控制多个步进电机

    千次阅读 2020-08-06 12:39:02
    Arduino ROTS控制多个步进电机 材料; 1、arduino mega2560 2、3个M42S驱动器 3、3个42步进电机 4、24V电源 #include <Arduino_FreeRTOS.h> #include <queue.h> //队列在这里很重要,串口接收的控制...
  • Arduino串口通信

    千次阅读 多人点赞 2020-09-25 21:58:54
    文章目录通信类型Arduino串口通信硬串口软串口 通信类型 通信是用来在不同电子设备之间交换数据用的技术,其实就是要实现不同电子设备之间的“通讯对话”。 Arduino串口通信 Arduino采用USART通信模式,可以有硬...
  • Arduino线程

    万次阅读 多人点赞 2019-05-08 15:43:59
    前言 本章节是如何使用Arduino线程技术。截止目前,Arduino 的性能很棒,但是... 为了正确理解线程技术和Arduino 之间的关系,我们需要理解为什么它不是真正的线程。 在计算机CPU上,线程应用程序...
  • 作为一个小白之前尝试用matlab读取多个电流、电压、光照强度等数据,并把数据分到不同的矩阵中,以及具备读取数据实时画图功能。网上一直找不到教程,后来自己想了个特别古老的方法,把arduino输出的数据在matlab...
  • Arduino 串行通信之串口通信 UART 原理及释义

    万次阅读 多人点赞 2019-03-28 09:43:53
    对于Arduino来说,甚至是对于电子学领域来说,信号分为数字信号和模拟信号。这两种信号又分为输入和输出两种情况,所以我的理解是电子学就是一门研究这四种情况相互关系的学科。模拟信号是一种连续变化的物理量,能帮助...
  • 使用Arduino完成STM32的串口通信

    千次阅读 2020-12-22 20:42:15
    相比标准外设库,STM32Cube HAL库表现出更高的抽象整合水平,HAL API集中关注各外设的公共函数功能,这样便于定义一套通用的用户友好的API函数接口,从而可以轻松实现从一STM32产品移植到另一不同的STM32系列...
  • 文章目录一、安装Ardunio二、串口通信1、任务要求2、所用器材3、主要代码4、代码解析三、代码效果四、基于标准库函数与基于HAL库函数的stm32编程方式的差异五、stduino IDE使用体会六、参考资料 一、安装Ardunio ...
  • 串口收到逗号分割的6串数字比如100,200,45,4,87,99然后在6PWM端口3, 5, 6, 9, 10, 11输出对应PWM值代码注释很详细了,就不再说明了。//定义comdata字符串变量,赋初值为空值 String comdata = ""...
  • arduino教程-05. 串口

    千次阅读 2018-12-22 13:57:19
    了解通过usb串口与电脑的通信;了解字符与字符串数据类型;利用项目了解通过电脑上的串口通信的方式, 项目功能:控制Arduino的第13脚的led。将依据用户输入“1”或“0”,点亮或关闭位于第13脚的LED。 5.2 器材:...
  • Arduino通过串口将采集的温湿度数据传给掌控板使用Mind+将数据上传至阿里云 在Mind+上使用 Arduino UNO上云的话,需要购买DFRobot的OBLOQ物联网模块,由于手头上没有这款通信模块,所以
  • Arduino串口通信全面讲解

    千次阅读 2020-10-14 17:12:37
    1.串口配置 Serial.begin(speed)、Serial.begin(speed, config)函数对串口进行初始化配置 speed:波特率,300、600、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200 config:数据位、校验位...
  • Arduino 自定义函数

    千次阅读 2021-03-27 18:54:29
    函数 就是你把一些动作打包,这动作可以理解为实现方法。 比如我想输出某些字符串; 比如我想输出两数的积; 比如我想控制LED灯亮灭; ...串口输出:无参无返回值 无参有返回值 void setup() {
  • Arduino串口乱码解决办法

    千次阅读 2019-05-04 15:33:14
    最近在做毕设,需要实现两块...在第一块主板程序里模拟了两个软串口,一是Bluetooth serial,也就是接蓝牙的管脚,用来接受蓝牙数据,另一是myserial,用来接舵机控制板。 在程序里定义char变量send...
  • 文章目录 前言 一、项目准备 1、硬件准备 2、软件准备 3、硬件连接 二、实验过程 1、Arduino采集数据及软串口发送数据 具体代码如下: 2、掌控板获取数据并上云 具体代码如下: 3、阿里云物联网平台 三、总结 前言 ...
  • 上图中通过HardwareSerial库实现了对串口1的使用,具体说明见下文。 详细说明 使用HardwareSerial库需要先声明一对象,例如上文图中的HardwareSerial mySerial1(1);; HardwareSerial类在声明对象时接收一输入...
  • Arduino串口详解

    千次阅读 多人点赞 2020-05-26 14:52:52
    串口是单片机通信方式中很重要的一种,我们的鼠标和键盘等等都是通过串口进行通讯的,那么如何更方便的使用Arduino串口呢,今天,我把串口的使用心得总结如下,希望对你有所帮助哦: 一.串口的基本函数 串口连接...
  • Arduino串口通信(Serial)

    万次阅读 多人点赞 2019-06-03 11:24:38
    Arduino串口的硬件结构 知道单片机运行原理的撸友们都清楚,单片机是基于微控制器(下称MCU)搭建的电子系统。单片机的所有功能其实都是由板载的MCU提供的,Arduino开发板当然也不例外。Arduino(这里单指Uno)的板...
  • //变量定义所有可能用到的这数组中注意数组的首地址是0 //建立这外挂文件的目的就是为了解决使用IDE编程环境无法编辑GB2312内码汉字的问题,请勿使用IDE编程环境打开编辑此文件,这样操作会将此文件改写为UTF8...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,970
精华内容 788
关键字:

arduino定义多个软串口