西安电子科技大学人工智能学院A测--双机串口通信系统
做A测在网上找半天没参考,最后好歹算是完成了。其实究竟对不对我也不知道,只能说大概的效果达到了,仅供参考,如果有错的地方请评论区指出,我也不希望错误一直存在。其实难度主要来自不熟悉。
首先是效果展示
-
虚拟终端VT_A输入学号截图(包括此时的虚拟终端VT_B)
-
B机收到后虚拟终端VT_B显示学号截图(包括此时的虚拟终端VT_A)
-
虚拟终端VT_B输入回应截图(包括此时的虚拟终端VT_A)
-
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 标识,并更新了注释以确保其清晰明了。
参考资料
- 《Arduino 端口这么多,都是做什么,掌握这些,你就可以入门啦》
https://www.bilibili.com/read/cv6619095/ - 《Arduino 板的说明》https://www.w3cschool.cn/arduino/arduino_board_description.html
- 《Arduino 串口通信》https://blog.csdn.net/xiaoshihd/article/details/108805015
- 《Arduino 基础入门篇(十四)串口通讯》
https://blog.csdn.net/2301_81461100/article/details/135263792 - 《初学者指南:如何在Arduino上配置串口通信?》
https://wenku.csdn.net/column/4442f7nnz2 - 《arduino 实现软串口通信》https://blog.csdn.net/lanhebe/article/details/93980739
- 《解决Logiccontention(s) detected on net 错误》
https://blog.csdn.net/haigear/article/details/103693281

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