arduino 串口读取字符串_Arduino入门 第八节-串口通讯(基础篇)

本文介绍了Arduino的串口基础操作,包括串口资源、串口发送(Serial.print(), Serial.println(), Serial.write()的区别)和接收数据的原理。通过示例程序解析如何使用串口发送字符串、数字,以及如何通过串口事件(serialEvent())实现特定字符触发的功能。此外,还提到了串口配置和ASCII码在串口通讯中的作用。" 80528592,7570780,微信爬虫实践:利用代理和模拟浏览器抓取信息,"['Python爬虫', '网络爬虫', '数据获取', '代理', '网页解析']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

串口是单片机中一种重要的数据通讯接口,本期我们就来学习一下Arduino的串口基础操作。首先我们来了解一下Arduino开发板的串口资源。在UNO及NANO板上,只有一组串口(Serial0),这个串口通过一个转换芯片(ATmega8、ATmega32、CH340、CP2102等)可以连接到电脑的USB口,也就是我们用来下载程序的接口,在板上引出的引脚中,也可以不通过转换芯片,这个主要用于与其他串口设备(电子模块或其它单片机)通讯。而在mega2560板上,则有4组串口:Serial0- Serial3,其中Serial0连接了转换芯片用于与电脑USB接口连接,其余三组则是直接从芯片引脚引出。

2201b811bc232ff9073a9baa336fd2db.png

发送数据

下面来看看第一个例程:串口发送字符串"Hello world!"到电脑。

0409b0fe477ffc6acf83e1b2f3e49c9b.png

在初始化函数中,执行了启动串口的函数,并且设置了串口的波特率为115200(即每秒传输115200个二进制位,注意:进行串口通讯的设备波特率必须一致)。在主循环中,不断地发送字符串"Hello world!",每发送一次等待1秒。下面是ArduinoIDE串口监视器接收到的内容:

36935073527d62437fc06c75453f7b6f.png

如果将输出函数改为Serial.println(),则在串口监视器中看到:

4e4e8e97c0f275df051caed3ea1e5db5.png

第二个例程,串口输出数字0-9,每个数字之间显示一个空格,每次输出数字9之后则换行,重新输出0-9。

### 使用 Arduino串口读取数据并拆分字符串Arduino 中,可以通过 `Serial` 对象实现串口通信功能。当接收到的数据到达时,可以触发中断事件(如果启用了 `SerialEvent` 功能)。为了完成从串口读取数据并将字符串按照指定分隔符进行拆分的任务,可以利用标准库中的函数。 #### 示例代码 以下是一个完整的示例代码,展示如何从串口读取数据,并将其按指定分隔符拆分为多个部分: ```cpp // 定义存储输入缓冲区的变量 String inputString = ""; // 存储接收到的完整字符串 bool stringComplete = false; // 标记是否已接收完整字符串 void setup() { Serial.begin(9600); // 初始化串口波特率为9600bps inputString.reserve(200); // 预留空间以提高性能 } void loop() { if (stringComplete) { // 如果已经接收到完整字符串 String dataParts[] = split(inputString, ','); // 按逗号拆分字符串 for (int i = 0; i < sizeof(dataParts)/sizeof(String); ++i) { Serial.print("Part "); Serial.print(i); Serial.print(": "); Serial.println(dataParts[i]); } inputString = ""; // 清空缓冲区以便下一次接收 stringComplete = false; } } // 处理串口中断事件 void serialEvent() { while (Serial.available()) { char inChar = (char)Serial.read(); // 逐字符读取 if (inChar == '\n') { // 当遇到换行符时表示结束 stringComplete = true; } else { inputString += inChar; // 将字符追加到缓冲区 } } } // 字符串拆分函数 String* split(String str, char delimiter) { int index = 0; int arrayLength = countOccurrences(str, delimiter) + 1; String *outputArray = new String[arrayLength]; int lastIndex = 0; int currentIndex = 0; while ((currentIndex = str.indexOf(delimiter, lastIndex)) != -1) { outputArray[index++] = str.substring(lastIndex, currentIndex); lastIndex = currentIndex + 1; } outputArray[index] = str.substring(lastIndex); return outputArray; } // 统计某个字符在字符串中出现的次数 int countOccurrences(String str, char c) { int count = 0; for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == c) { count++; } } return count; } ``` --- #### 关键点解析 1. **串口初始化** 在 `setup()` 函数中调用 `Serial.begin(9600)` 来设置串口通讯速率[^2]。此参数应与外部设备保持一致。 2. **串口中断机制** 利用 `serialEvent()` 函数捕获串口数据流的变化。每当有新字节可用时,该函数会被自动调用[^1]。 3. **字符串拼接与标记** 接收过程中逐步构建字符串直到检测到终止符 `\n`,此时将标志位设为真表示已完成一条消息的接收。 4. **自定义拆分逻辑** 提供了一个通用方法用于依据特定分隔符切割目标字符串成数组形式返回给调用者使用。 5. **内存管理注意事项** 动态分配数组需谨慎考虑资源消耗情况,在实际应用前测试其稳定性以及优化可能存在的泄漏风险[^3]。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值