SoftwareSerial库的使用——Arduino软件模拟串口通信

2023-11-01

除HardwareSerial外,Arduino还提供了SoftwareSerial类库,它可以将你的其他数字引脚通过程序模拟成串口通信引脚。
通常我们将Arduino UNO上自带的串口称为硬件串口,而使用SoftwareSerial类库模拟成的串口,称为软件模拟串口(简称软串口)。
在Arduino UNO上,提供了0(RX)、1(TX)一组硬件串口,可与外围串口设备通信,如果要连接更多的串口设备,可以使用软串口。
软串口是由程序模拟实现的,使用方法类似硬件串口,但有一定局限性:在Arduino UNO MEGA上部分引脚不能被作为软串口接收引脚,且软串口接收引脚波特率建议不要超过57600。
SoftwareSerial类成员函数
软串口类库并非Arduino UNO核心类库,因此使用前你需要先声明包含SoftwareSerial.h头文件。
其中定义的成员函数与硬件串口类似,available()、begin()、read()、write()、print()、println()、peek() 等用法相同,这里便不一一列举。
此外软串口后还有如下成员函数:

SoftwareSerial()
SoftwareSerial类的构造函数,通过它可指定软串口RX、TX引脚。
语法:
SoftwareSerial mySerial= SoftwareSerial(rxPin, txPin)
SoftwareSerial mySerial(rxPin, txPin)
参数:
mySerial:用户自定义软件串口对象
rxPin:软串口接收引脚
txPin:软串口发送引脚

listen()
开启软串口监听状态。
Arduino UNO在同一时间仅能监听一个软串口,当你需要监听某一软串口时,需要该对象调用这个函数开启监听功能。
语法:
mySerial.listen()
参数:
mySerial:用户自定义的软件串口对象
返回值:

isListening()
监测软串口是否正在监听状态。
语法:
mySerial.isListening()
参数:
mySerial:用户自定义的软件串口对象
返回值:
Boolean型
True:正在监听
False:没有监听

end()
停止监听软串口。
语法:
mySerial. end()
参数:
mySerial:用户自定义的软件串口对象
返回值:
Boolean型
True:关闭监听成功
False:关闭监听失败

overflow()
检测缓冲区是否溢出。
语法:
mySerial.overflow()
参数:
mySerial:用户自定义的软件串口对象
返回值:
Boolean型
True:溢出
False:没有溢出

建立软串口通信
SoftwareSerial类库是Arduino IDE默认提供的一个第三方类库,和硬件串口不同,其声明并没有包含在Arduino核心库中,因此要建立软串口通信,首先需要声明包含SoftwareSerial.h头文件,然后即可使用该类库中的构造函数,初始化一个软串口实例。如:
SoftwareSerial mySerial(2, 3);
即是新建一个名为mySerial的软串口,并将2号引脚作为RX端,3号引脚作为TX端。完整示例如下:

/*
Arduino UNO软串口通信
*/

#include <SoftwareSerial.h>
//实例化软串口
SoftwareSerial mySerial(2, 3); // RX, TX

void setup()
{
  Serial.begin(115200);
  while (!Serial) {
  }

  Serial.println("Goodnight moon!");

  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

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

在实际使用中,你可能还会用到其他串口设备,如串口无线透传模块、串口传感器等,只要是标准串口设备,其程序的编写方法都基本相同。

同时使用多个软串口
当需要连接多个串口设备时,可以建立多个软串口,但限于软串口的实现原理,Arduino UNO只能同时监听一个软串口,当存在多个软串口设备时,你需要使用listen() 函数指定需要监听的设备。如程序中存在portOne、portTwo两个软串口对象时,你欲监听portOne,便需要使用portOne.listen() 语句,要切换监听port2,便使用portTwo.listen() 语句。
示例程序如下:

/*[kenrobot_code]
Arduino UNO软串口通信
通过listen()切换监听软串口
*/
#include <SoftwareSerial.h>
SoftwareSerial portOne(10, 11);
SoftwareSerial portTwo(8, 9);

void setup() {
  Serial.begin(9600);
  while (!Serial) {
  }

  portOne.begin(9600);
  portTwo.begin(9600);
}

void loop() {
//监听1号软串口
  portOne.listen();

  Serial.println("Data from port one:");
  while (portOne.available() > 0) {
    char inByte = portOne.read();
    Serial.write(inByte);
  }

  Serial.println();
//监听2号软串口
  portTwo.listen();

  Serial.println("Data from port two:");
  while (portTwo.available() > 0) {
    char inByte = portTwo.read();
    Serial.write(inByte);
  }
  Serial.println();
}		//[/kenrobot_code]

本文转自arduino中文论坛
https://www.arduino.cn/forum.php?mod=viewthread&tid=47262&highlight=软串口

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SoftwareSerial库的使用——Arduino软件模拟串口通信 的相关文章

  • 使用 pySerial 等待 Arduino 自动重置

    我正在尝试在 Linux 上使用非常简单的代码 为了展示问题 从 Arduino 板上读取行 Python代码 arduino py import serial arduino serial Serial dev ttyACM0 with
  • Arduino“SerialEvent”示例代码无法在我的 Arduino Nano 上运行。我无法接收串行数据。为什么?

    我正在按照教程进行操作串行事件 https www arduino cc en Tutorial BuiltInExamples SerialEvent我正在尝试这段代码 然而 当我发送我的Arduino 纳米 https en wikip
  • 如何在观察者中处理具有不同状态值类型的 Observables

    首先是上下文和问题 框架代码在帖子底部 我们正在创建并实现一个 C 框架 以便在 Arduino 等环境中使用 为此 我想使用观察者模式 其中任何对传感器状态变化感兴趣的组件 Observables 可以注册自己 并且它将通过 Observ
  • printf 的包装

    我在Arduino下编码 我想开发串行打印格式化功能 所以我尝试使用sprintf未知大小的缓冲区 基本上 我们可以避免谈论 Arduino 及其串行输出 并考虑将文本写入缓冲区 然后使用printf 我试过这个 include
  • 蓝牙 HC-05 发送错误 1F 仅适用于 INQ 命令

    我的新蓝牙 HC 05 模块有问题 在 AT 模式下 它可以与我需要的所有命令完美配合 除了 INQ 我已经尝试事先发送一大堆其他命令 AT INIT OK AT ORGL OK AT ROLE 1 OK AT CLASS 0 OK 他们都
  • PySerial 从 Arduino 读取线路的延迟

    我正在使用带有基本 DigitalReadSerial 设置的 arduino uno 如下所述 http arduino cc en Tutorial DigitalReadSerial http arduino cc en Tutori
  • 如何将 ASCII char 转换为其 ASCII int 值?

    我想将 char 转换为它的ASCII http en wikipedia org wiki ASCIIint 值 我可以用所有可能的值填充一个数组并与其进行比较 但这对我来说似乎不正确 我想要类似的东西 char mychar k pub
  • Android BLE 扫描与 UUID 过滤器列表混淆

    我正在 Android 移动设备 A 上执行 UUID 过滤扫描 并且有两个测试用例 一个人在另一台 Android 设备 移动设备 b 上使用名为 BLE Scanner 的应用程序来创建具有两个测试服务 每个服务都有自己唯一的 UUID
  • sim800L GPRS 发布请求

    我一直在研究 LoNet 迷你 GSM 模块 SIM800L 并将其与 Arduino 连接 我已插入 SIM 移动卡并且可以连接互联网 通过串行监视器 我可以毫无问题地与它通信 但是当向网络服务器页面发出 GET 或 POST 请求时 它
  • 静态 uint8_t 数组的输入过程和类型

    我目前正在尝试将 Arduino IDE 中的整数变量转换为静态 uint8 t 数组的值 我在用 include
  • ESP32 Arduino-ide如何获取唯一id

    我试图自动为每个 esp32 设置一个唯一的 id 在我使用提供该方法的 ESP IDF 框架对设备进行编程之前esp efuse mac get default 这将返回一个 8 字节值 该值在我手上的所有设备上都是唯一的 在arduin
  • 如何实现Android Open Accessory模式即服务?

    我一直在研究 Android 开放配件开发套件 依照指示Google 提供的 DemoKit 示例 http developer android com guide topics usb accessory html 我在使解决方案适应我的
  • 带/不带类的回调函数指针 C++

    我被困 我正在尝试形成一个函数 它将吃掉无类函数指针和对象中的函数指针 这是我当前的代码 希望能解释更多 它应该在 Arduino 上运行 所以我不能使用大型库 首先 我在 Arduino 上使用这个库 SimpleTimer A time
  • ESP8266 I2C从机不确认数据

    我有一个 TM4C123 处理器作为 I2C 主处理器 一个 ESP8266 作为从处理器 对于 ESP 我使用的是 Arduino IDE 并在 2 5 2 版安装了 ESP8266 支持 它应该支持 I2C 从模式 但是 我无法让它工作
  • 使用 SPIFFS 加载文件时出现问题 (ERR_CONTENT_LENGTH_MISMATCH)

    好吧 这两天我一直在研究这个问题 但我仍然觉得我一无所获 我最近开始使用SPIFFS 文件系统 for Arduino开发于呼扎 ESP8266像FSBrowser ino例如 虽然它在分离代码方面非常出色 但随着我的代码不断增长 它在稳定
  • 是否可以在 Arduino 上运行 ZeroMQ

    我想知道是否可以通过 ZeroMQ 与 Arduino 进行通信 我想使用 Arduino 来控制一些设备 并希望将大部分应用程序放在计算机上 为此 如果 Arduino 和控制器可以通过 Zeromq 以及 WiFi 或以太网扩展板进行通
  • 如何提高 PySerial 读取速度

    我目前正在构建一台使用 Arduino Mega2560 作为主控制器的机器 Arduino 通过串口连接 获取命令 执行它并每 1ms 吐出一堆测量数据 我有一个运行 Python 的 Raspberry Pi 为用户提供一个漂亮的 GU
  • 如何将 Android 应用程序正确连接到支持蓝牙的 Arduino 微控制器上的 RFCOMM 套接字?

    我正在与我大学的一些学生合作开发一个简单的蓝牙 Android 应用程序 该应用程序将用于与连接有蓝牙模块的 Arduino 微控制器进行串行通信 RFCOMM 据我所知 我正在使用正确的蓝牙地址和 UUIDRFCOMM SPP 00001
  • 无法访问超过 255 个的 Modbus 寄存器 SimpleModbus

    我是法国学生 我已经使用 SimpleModbus 1 周了 它工作得很好 直到我尝试实现一个具有大量寄存器 1000needed 使用从站 1 无法访问超过 255 个的寄存器 无论我做什么 一旦寄存器读数超过 255 我就会收到超时错误
  • Arduino 上的串行消息到整数

    我希望我的 Arduino 通过串行通信接收一个整数 你能帮我解决这个问题吗 它应该是这样的形式 int value strtoint Serial read 有多种方法可以读取整数Serial 很大程度上取决于数据发送时的编码方式 Ser

随机推荐

  • java bean的引用_JavaBean的详细及引用

    1 JavaBean实际是具有统一接口格式的java类 2 JavaBean的组成 属性 Properties 方法 Method 事件 Events 3 一个JavaBean的例子 该例子是用的Simple属性 我遵循的习惯是类名大写 包
  • 测牛学堂:软件测试要掌握的sql之命令行必会知识总结(5)

    删除数据库表的操作 drop table if exists xxx 表示当xxx表存在的时候才会执行删除操作 drop table students drop table if exists students 表中插入数据的操作 1 全部
  • Linux多线程编程初探

    Linux线程介绍 进程与线程 典型的UNIX Linux进程可以看成只有一个控制线程 一个进程在同一时刻只做一件事情 有了多个控制线程后 在程序设计时可以把进程设计成在同一时刻做不止一件事 每个线程各自处理独立的任务 进程是程序执行时的一
  • SpringBoot原理概述

    文章目录 一 SpringBoot概述 二 运行原理剖析 1 核心运行原理 Pom xml 主启动类 2 构造流程分析 3 运行流程分析 三 配置与使用 1 配置文件 2 自动配置原理 四 趣味练习 自定义starter 一 SpringB
  • SQL 列转行

    https blog csdn net vipxiaotian article details 4409423 普通行列转换 爱新觉罗 毓华 2007 11 18于海南三亚 假设有张学生成绩表 tb 如下 Name Subject Resu
  • std::set 的删元素 c++

    程序演示std set的删除操作 set类模板中 它和vector list不同 set map都是关联式容易 set 内部是基于红黑树实现的 插入和删除操作效率比较高 下面测试一下怎么删除set的里面的元素 include
  • 台资企业管理职的中英文称谓以及级别

    台资企业管理职的中英文称谓以及级别 从低到高 组长 team leader 课长 supervisor 专理 assistant manager 也就是经理助理 经理 manager 资深经理 senior manager 即我们说的高级经
  • UVA-215 电子表格计算器 题解答案代码 算法竞赛入门经典第二版

    GitHub jzplp aoapc UVA Answer 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 题目并不难 数据量也不大 一次数据最多是20 10是200个 因此即使最长的嵌套引用关系 也只有200层 我们使用暴力 循环200
  • 【ubuntu】ubuntu添加或删除用户

    文章目录 1 创建新用户 2 为新用户填加超级用户权限 方法一 填加新用户到sudo group 方法二 在 etc sudoers中指定用户的权限 3 删除用户 创建新用户的意义不再多述 最直观的就是多个人用同一台机器 要为每个人创建一个
  • tomcat自动加载改变的class文件,且无需重启

    不重启Tomcat有两种方式 热部署 热加载 热部署 容器在运行时重新部署整个项目 这类环境下 一般整个内存会被清空 重新加载 这类方式有可能造成sessin丢失等问题 tomcat 6以上已解决该问题 热加载 最好是在调试过程中使用 以免
  • Caffe源码:math_functions 解析

    目录 目录 主要函数 caffe cpu gemm 函数 caffe cpu gemv 函数 caffe axpy 函数 caffe set 函数 caffe add scalar 函数 caffe copy 函数 caffe scal 函
  • 基于ChatGPT-API实现聊天机器人服务

    1 背景 要基于GPT自己去实现一个聊天机器人服务功能实现上其实特别简单 将上游服务过来的请求转换为GPT接口请求发出去然后直接返回或者回调给上游服务即可 但是其中的一些其他问题不知道大家有没有考虑过 1 搞成一个大同步的实现 当并发真的上
  • 集合方法的代码

    创建一个集合 获取从 某一索引开始到某一索引的前一位结束的代码 class b public static void main String args List
  • GO语言学习-变量2和常量与iota枚举

    变量进阶 1 多重赋值 从左至右依次匹配 如果有不需要的数据用匿名变量处理 2 匿名变量 下划线 丢弃数据不处理 匿名变量主要用于配合函数返回值使用 注 go语言的函数返回值可以有多个 使用匿名变量可以舍去不需要的返回值 package m
  • 下载安装Android Studio教程

    步骤1 下载Android Studio 访问Android Studio官方网站 https developer android com studio 点击 下载Android Studio 按钮 选择适用于您操作系统的版本 然后下载安装
  • Unix Shell 范例精解——awk课后题

    题目数据如下 Mike Harrington 510 548 1278 250 100 175 Christian Dobbins 408 538 2358 155 90 201 Susan Dalsass 206 654 6279 250
  • Three.js 基础- 第 2 章 - 几何体BufferGeometry

    Three js 基础 第 2 章 几何体BufferGeometry Three js教程 几何体BufferGeometry 在Three js中 几何体是3D对象的基本形状 本教程将介绍如何使用缓冲类型几何体BufferGeometr
  • 【独家源码】ssm高校试卷管理系统i0lzr应对计算机毕业设计困难的解决方案

    本项目包含程序 源码 数据库 LW 调试部署环境 文末可获取一份本项目的java源码和数据库参考 系统的选题背景和意义 选题背景 高校试卷管理是教学工作中的重要环节 涉及到试卷的编写 存储 分发和评阅等多个方面 然而 传统的试卷管理方式存在
  • [转]Java 线程池的原理与实现

    最近在学习线程池 内存控制等关于提高程序运行性能方面的编程技术 在网上看到有一哥们写得不错 故和大家一起分享 分享 Java 线程池的原理与实现这几天主要是狂看源程序 在弥补了一些以前知识空白的同时 也学会了不少新的知识 比如 NIO 或者
  • SoftwareSerial库的使用——Arduino软件模拟串口通信

    除HardwareSerial外 Arduino还提供了SoftwareSerial类库 它可以将你的其他数字引脚通过程序模拟成串口通信引脚 通常我们将Arduino UNO上自带的串口称为硬件串口 而使用SoftwareSerial类库模