当前位置: 首页 > news >正文

A测题目名称: 双机串口通信系统

题目名称:  双机串口通信系统  

一、题目要求

软件环境:推荐采用 Proteus 8.9 SP2 及以上仿真软件,Arduino IDE。

实现功能:使用 2 个 Arduino UNO 微控制器,搭建一个双机串口双向通信系统。

·功能:2个Arduino UNO(A机和B机)通过软件串行接口连接进行双向通信。 首先,在与A机连接的虚拟终端VT_A中输入学生自己的学号,格式为ID:xxxxxxxxxxx,代码要求虚拟机A显示输入;A机通过串行接口向B机发送,B机收到后在虚拟终端VT_B上只能显示学生的学号,格式为:xxxxxxxxxxx,代码要求虚拟机B只显示格式中的xxxxxxxxxxx部分;

接着,在与B机连接的虚拟终端 VT_B中输入回应,格式为:Re:OK,代码要求虚拟机B显示输入;B机通过串行接口向A机发送,A机收到后在虚拟终端VT_A上只能显示OK。

二、设计思路

两个Arduino UNO开发板通过软串口建立通信时,通常采用IO4与IO5引脚互联的方式。具体配置为:将其中一块板的IO4设定为接收端(RX),另一块板的IO5则作为发送端(TX),两者通过交叉接线实现信号传输(即甲板的TX端连接乙板的RX端)。这种硬件对接方式可构建双向数据通道,使两个微控制器能够互相收发信息,其连接示意图如下所示:

三、仿真结果展示

1.虚拟终端 VT_A 输入学号(输入自己学号)截图(包括此时的虚拟终端 VT_B)

2.B 机收到后虚拟终端 VT_B 显示学号截图(包括此时的虚拟终端 VT_A)

3.虚拟终端 VT_B 输入回应截图(包括此时的虚拟终端 VT_A)

4.A 机收到后虚拟终端 VT_A 显示回应截图(包括此时的虚拟终端 VT_B)

四、程序设计(用Arduino编写)

A机源代码:

#include <SoftwareSerial.h>

// 定义软串口的引脚
SoftwareSerial mySerial(4, 5); // RX, TX

void setup() {
    Serial.begin(9600); // 初始化默认串口
    mySerial.begin(9600); // 初始化软串口
}

void loop() {
    // 从虚拟终端 VT_A 接收输入
    if (Serial.available()) {
        String input = Serial.readStringUntil('\n'); // 读取输入直到换行
        Serial.println(input); // 显示输入
        
        // 检查格式并发送到 B 机
        if (input.startsWith("ID:")) {
            String studentID = input.substring(3); // 提取学号部分
            mySerial.println(studentID); // 发送学号到 B 机
        }
    }

    // 从 B 机接收回应
    if (mySerial.available()) {
        String response = mySerial.readStringUntil('\n'); // 读取回应直到换行
        if (response.startsWith("Re:")) {
            String reply = response.substring(3); // 提取回应内容
            Serial.println(reply); // 显示回应内容
        }
    }
}

B机源代码:

#include <SoftwareSerial.h>

// 定义软串口的引脚
SoftwareSerial mySerial(4, 5); // RX, TX

void setup() {
    Serial.begin(9600); // 初始化默认串口
    mySerial.begin(9600); // 初始化软串口
}

void loop() {
    // 从 A 机接收学号
    if (mySerial.available()) {
        String studentID = mySerial.readStringUntil('\n'); // 读取学号直到换行
        Serial.println(studentID); // 显示完整学号
    }

    // 从虚拟终端 VT_B 接收回应
    if (Serial.available()) {
        String input = Serial.readStringUntil('\n'); // 读取输入直到换行
        Serial.println(input); // 显示输入
        
        // 检查格式并发送回 A 机
        if (input.startsWith("Re:")) {
            mySerial.println(input); // 发送回应到 A 机
        }
    }

    // 接收来自 A 机的回应
    if (mySerial.available()) {
        String response = mySerial.readStringUntil('\n'); // 读取回应直到换行
        Serial.println(response); // 显示 OK
    }
}

备注:代码有一丢丢小问题,就是图1和图2结果会同时出现,图3和图4同理。但由于时间紧(其实是懒。。。)没有再改代码,大家可以自己添加修改。又或者其实用Backspace键就能轻松得到题中要求的4张图的效果。(🐶

相关文章:

  • obsidian插件:Tasks Calendar Wrapper,更清晰的任务列表系统
  • unity webgl导出嵌套html以及导入django
  • 友思特新品 | OCT-3D断层扫描成像测量系统OQ StrataScope升级2.0型号!
  • 【开源项目-爬虫】Firecrawl
  • windows C++ 申请大量内存
  • Spring boot3-Http Interface: 声明式编程
  • 第十九:channel 的使用
  • Docker容器安装软件(完整版)
  • 阿里云短信发送(工厂模式实现)
  • C++:二分习题
  • never_give_up
  • 【C++ 系列文章 基础 01 -- std::string 与 fmt::format】
  • Java线程安全
  • Vue3 深度解析:构建现代Web应用的全新范式
  • 【PCIe 总线及设备入门学习专栏 3 -- PCIe 三种路由方式详细介绍】
  • 淘晶驰 屏幕 应用 之 esp8266/arduino 简约时钟 2025/3/12
  • sql靶场-时间盲注(第九、十关)保姆级教程
  • Trae AI IDEA安装与使用
  • 【机器学习】主成分分析法(PCA)
  • 数组总和 (leetcode 40
  • 不是10点!乌克兰官员称尚未就俄乌谈判开始时间达成一致
  • 杭州“放大招”支持足球发展:足球人才可评“高层次人才”
  • 俄官员说将适时宣布与乌克兰谈判代表
  • 福建厦门市副市长、市公安局局长陈育煌出任吉林省公安厅厅长
  • 俄乌拟在土耳其举行会谈,特朗普:我可能飞过去
  • 英国首相斯塔默住所起火,警方紧急调查情况