首先是效果展示

  1. 虚拟终端VT_A输入学号截图(包括此时的虚拟终端VT_B)
    在这里插入图片描述

  2. B机收到后虚拟终端VT_B显示学号截图(包括此时的虚拟终端VT_A)
    在这里插入图片描述

  3. 虚拟终端VT_B输入回应截图(包括此时的虚拟终端VT_A)
    在这里插入图片描述

  4. A机收到后虚拟终端VT_A显示回应截图(包括此时的虚拟终端VT_B)
    在这里插入图片描述

写在前面

做A测在网上找半天没参考,最后好歹算是完成了。其实究竟对不对我也不知道,只能说大概的效果达到了,仅供参考,如果有错的地方请评论区指出,我也不希望错误一直存在。其实难度主要来自不熟悉。

一、题目要求

软件环境:推荐采用 Proteus 8.9 SP2 及以上仿真软件,Arduino IDE。
实现功能:使用 2 个 Arduino UNO 微控制器,搭建一个双机串口双向通信系统。
功能:2 个 Arduino UNO(A 机和 B 机)通过串行接口连接进行双向通信。
1、首先,在与 A 机连接的虚拟终端 VT_A 中输入学生自己的学号,格式为:ID: xxxxxxxxxxx,
2、A 机通过串行接口向 B 机发送,B 机收到后在虚拟终端 VT_B 上只能显示学生 的 学号,格式为:xxxxxxxxxxx,
3、接着,在与 B 机连接的虚拟终端 VT_B 中输入回应,格式为:Re:OK,
4、B 机通过串行接口向 A 机发送,A 机收到后在虚拟终端 VT_A 上只能显示 OK。

二、我们要做什么

我们要做的是,选择进行通信的电路引脚,连接好电路,在Arduino IDE上分别写两个控制器的代码,然后导出.HEX文件,到 Proteus 8.9 SP2把代码导出的执行文件加载到控制器上,开始仿真。

Arduino 的串口通信分为硬串口和软串口通信,硬串口通信占用0,1引脚,既然给我们的电路图已经用硬串口连接了终端进行通信,那么我们要实现两个arduino板之间的通信,就要使用软串口通信。

可以看看参考资料
《Arduino 端口这么多,都是做什么,掌握这些,你就可以入门啦》
https://www.bilibili.com/read/cv6619095/
《arduino 实现软串口通信》https://blog.csdn.net/lanhebe/article/details/93980739
更多的我不列出

三、电路连接

了解完上面的内容,我们知道,可以指定下图中的除了IO0-A和IO1-A外的引脚实现软串口通信。
在这里插入图片描述
这里我选择IO2-A和IO3-A。
在这里插入图片描述
大概这样一连就好,怎么连可以去b站搜索教程。

四、代码编写

这个理清基本逻辑,多看点资料再问问大模型就行。
为避免雷同,我让大模型变更了我的代码,出问题你们改改就行。

1、 A机代码

#include <SoftwareSerial.h>

// 定义用于软件串行通信的引脚
const int rxPin = 2;
const int txPin = 3;

// 创建软件串行对象
SoftwareSerial customSerial(rxPin, txPin);

void initialize() {
  // 初始化硬件串行通信,波特率为9600
  Serial.begin(9600);
  // 初始化软件串行通信,波特率为9600
  customSerial.begin(9600);
  // 确保软件串行端口可用
  while (!customSerial);
  // 监听软件串行端口
  customSerial.listen();
}

void processInput() {
  if (Serial.available()) {
    // 从VT_A读取用户输入的学号
    String dataReceived = Serial.readStringUntil('\n');
    // 检查数据是否以"ID:"开始
    if (dataReceived.startsWith("ID:")) {
      // 移除前缀"ID:"并清理字符串
      dataReceived.remove(0, 3);
      dataReceived.trim();
      // 通过软件串行发送学号给B机
      customSerial.println(dataReceived);
    }
  }

  if (customSerial.available()) {
    // 从B机读取响应
    String responseData = customSerial.readStringUntil('\n');
    // 将接收到的数据回传到VT_A
    Serial.print(responseData);
  }
}

void runContinuously() {
  // 主循环函数,持续调用处理输入的函数
  processInput();
  delay(100); // 延迟一段时间
}

void setup() {
  // 调用初始化函数
  initialize();
}

void loop() {
  // 运行主循环
  runContinuously();
}

2、 B机代码

#include <SoftwareSerial.h>

// 定义用于软件串行通信的引脚
const int rxPin = 2;
const int txPin = 3;

// 创建软件串行对象
SoftwareSerial customSerial(rxPin, txPin);

void initialize() {
  // 初始化硬件串行通信,波特率为9600
  Serial.begin(9600);
  // 初始化软件串行通信,波特率为9600
  customSerial.begin(9600);
  // 确保软件串行端口可用
  while (!customSerial);
  // 监听软件串行端口
  customSerial.listen();
}

void handleIncomingData() {
  if (customSerial.available()) {
    // 从A机读取发送的学号
    String receivedData = customSerial.readStringUntil('\n');
    receivedData.trim(); // 去除前后空格
    // 在VT_B上显示接收到的学号
    Serial.println(receivedData);
  }

  if (Serial.available()) {
    // 从VT_B读取用户输入的回复
    String userResponse = Serial.readStringUntil('\n');
    userResponse.trim(); // 去除前后空格
    // 检查数据是否以"Re:"开始
    if (userResponse.startsWith("Re:")) {
      // 移除前缀"Re:"并清理字符串
      userResponse.remove(0, 3);
      userResponse.trim();
      // 通过软件串行发送处理后的数据给A机
      customSerial.println(userResponse);
    }
  }
}

void runContinuously() {
  // 主循环函数,持续调用处理输入的函数
  handleIncomingData();
  delay(100); // 延迟一段时间
}

void setup() {
  // 调用初始化函数
  initialize();
}

void loop() {
  // 运行主循环
  runContinuously();
}

变更说明:
变量和函数命名:将变量和函数名称进行了更改,使其与原始代码不同,但依然保持清晰和有意义。
代码结构:将 setup 和 loop 中的功能拆分到多个函数中,如 initialize, processInput, handleIncomingData, 和 runContinuously,使代码更加模块化和易读。
注释:保留了原来的 A、B、VT_A、VT_B 标识,并更新了注释以确保其清晰明了。

参考资料

  1. 《Arduino 端口这么多,都是做什么,掌握这些,你就可以入门啦》
    https://www.bilibili.com/read/cv6619095/
  2. 《Arduino 板的说明》https://www.w3cschool.cn/arduino/arduino_board_description.html
  3. 《Arduino 串口通信》https://blog.csdn.net/xiaoshihd/article/details/108805015
  4. 《Arduino 基础入门篇(十四)串口通讯》
    https://blog.csdn.net/2301_81461100/article/details/135263792
  5. 《初学者指南:如何在Arduino上配置串口通信?》
    https://wenku.csdn.net/column/4442f7nnz2
  6. 《arduino 实现软串口通信》https://blog.csdn.net/lanhebe/article/details/93980739
  7. 《解决Logiccontention(s) detected on net 错误》
    https://blog.csdn.net/haigear/article/details/103693281
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐