答案仅供参考,未必正确,请如需使用请核实。
第八部分 UART串口通信
填空题
- Arduino Mega 2560具有____个硬件UART串口。
答案:4 - 在UART通信中,波特率是指每秒传输的____数。
答案:比特(位) - 并行通信中,数据是通过____条线路同时传输的。
答案:多条 - 串行通信中,数据是按____顺序一位一位传输的。
答案:时间 - 异步通信中,每个数据包前通常会有一个____信号来标识数据的开始。
答案:起始位 - 同步通信需要____信号来保持发送端和接收端的时钟同步。
答案:时钟 - 在全双工通信中,设备可以同时进行____和____。
答案:发送;接收 - 半双工通信意味着设备在任何时候只能____或____,不能同时进行。
答案:发送;接收 - UART通信中常见的错误检测方式包括奇偶校验和____。
答案:循环冗余校验(CRC) - Arduino Mega 2560的UART串口默认波特率是____。
答案:9600 - 通过设置寄存器UCSR0A的____位,可以选择UART的数据格式(如8位数据,1位停止位)。
答案:U2X0 - 在UART通信中,停止位的作用是____。
答案:标识数据包的结束,并提供一定的时间间隔以便接收方准备接收下一个数据包。 - Arduino Mega 2560的串口通信可以通过____函数初始化。
答案:Serial.begin() - 串行通信中,波特率越高,数据传输____越快。
答案:速度 - 使用软件模拟串口(如SoftwareSerial库)时,可以选择Arduino Mega 2560上的____引脚作为RX和TX。
答案:任意数字
单选题
- 下列哪项不是UART通信的特点?
A. 异步通信
B. 并行数据传输
C. 使用起始位和停止位
D. 可配置波特率
答案:B - Arduino Mega 2560的哪个函数用于发送一个字符?
A. Serial.print()
B. Serial.write()
C. Serial.read()
D. Serial.available()
答案:B - 同步通信与异步通信的主要区别在于?
A. 数据传输速率
B. 是否需要时钟信号
C. 通信距离
D. 使用的电线数量
答案:B - 全双工通信与半双工通信的主要区别是什么?
A. 数据传输速率不同
B. 通信方向不同
C. 使用协议不同
D. 电线数量不同
答案:B - 下列哪个不是串行通信中常见的错误检测方式?
A. 奇偶校验
B. CRC校验
C. 校验和
D. 数据加密
答案:D - Arduino Mega 2560默认的串口通信波特率是?
A. 4800
B. 9600
C. 19200
D. 115200
答案:B - 在UART通信中,起始位的作用是?
A. 标识数据包的开始
B. 校验数据正确性
C. 提供时钟信号
D. 标识数据包的结束
答案:A - 下列哪个函数用于检查Arduino串口缓冲区中是否有可读数据?
A. Serial.print()
B. Serial.read()
C. Serial.available()
D. Serial.end()
答案:C - 使用Arduino的SoftwareSerial库时,可以模拟多少个软件串口?
A. 1
B. 2
C. 3
D. 无限多个
答案:B - 并行通信相比串行通信的主要优势是?
A. 需要的电线更少
B. 传输速度更快
C. 成本更低
D. 更适合远距离传输
答案:B - UART通信中,数据位通常是几位?
A. 4
B. 6
C. 8
D. 16
答案:C - 下列哪个不是影响串口通信稳定性的因素?
A. 波特率设置
B. 电线长度
C. 环境温度
D. 数据格式
答案:D - Arduino Mega 2560上的硬件串口编号是从多少开始的?
A. 0
B. 1
C. 2
D. 3
答案:A - 在半双工通信中,设备如何切换发送和接收模式?
A. 自动切换
B. 手动切换
C. 同时进行
D. 不需要切换
答案:B - 下列哪个不是Arduino串口通信中常用的函数?
A. Serial.begin()
B. Serial.println()
C. Serial.flush()
D. Serial.close()
答案:D
判断题
- UART通信是同步通信的一种。()
答案:错 - Arduino Mega 2560支持多个硬件UART串口。()
答案:对 - 在串行通信中,波特率越高,数据传输越稳定。()
答案:错 - 并行通信比串行通信需要更多的电线。()
答案:对 - 异步通信不需要时钟信号来同步发送和接收。()
答案:对 - 全双工通信允许设备同时发送和接收数据。()
答案:对 - 半双工通信中,设备不能同时发送和接收数据。()
答案:对 - UART通信中,停止位用于标识数据包的开始。()
答案:错 - Arduino Mega 2560的串口通信波特率可以通过软件调整。()
答案:对 - 使用SoftwareSerial库可以在Arduino Mega 2560上模拟硬件串口。()
答案:对 - 串行通信中,奇偶校验是用来检测数据传输错误的。()
答案:对 - 在UART通信中,数据位只能是8位。()
答案:错 - Arduino Mega 2560的串口通信默认使用硬件串口0。()
答案:对 - 同步通信比异步通信更适合远距离传输。()
答案:错 - 串口通信中,波特率设置不一致会导致通信失败。()
答案:对
//cslg单片机串口案例
const int BUFFER_SIZE = 128; // 定义缓冲区大小
char buffer[BUFFER_SIZE]; // 创建缓冲区
int index = 0; // 缓冲区索引
void setup() {
Serial.begin(9600); // 初始化串口通信,波特率设置为9600
Serial.println("虽然听不懂,老师讲得也烂,但我们超级喜欢单片机这门课呢!!!");
}
void loop() {
// 检查串口是否有数据可读
if (Serial.available() > 0) {
// 读取一个字节
char incomingByte = Serial.read();
// 检查是否达到了缓冲区大小限制
if (index < BUFFER_SIZE - 1) {
// 将字节添加到缓冲区中
buffer[index++] = incomingByte;
// 检查是否收到了字符串结束符(换行符)
if (incomingByte == '\n') {
// 在缓冲区末尾添加字符串结束符(对于计算字符数不是必需的,但有助于打印)
buffer[index] = '\0';
// 计算字符串的字符数(不包括结尾的'\0')
int stringLength = index - 1; // 减1是因为我们不包括换行符'\n'
// 打印接收到的字符串及其字符数
Serial.print("收到啦,收到啦,不要再哔哔啦: ");
Serial.println(buffer);
Serial.print("您看看您哔哔了多少个字符: ");
Serial.println(stringLength);
// 清空缓冲区索引以准备接收下一个字符串
index = 0;
}
} else {
// 如果缓冲区满了,打印错误消息并清空缓冲区
Serial.println("爆了吧,哔哔的缓冲区都炸了,罪孽啊...");
index = 0;
}
}
}
这段代码是一个基于Arduino平台的串口通信示例,用于接收通过串口发送的数据,并将其存储在缓冲区中,直到接收到换行符(\n
)为止。然后,它会打印出接收到的字符串及其字符数,并清空缓冲区以准备接收新的数据。下面是对代码的详细解释:
变量定义
-
const int BUFFER_SIZE = 128;
:定义了一个常量BUFFER_SIZE
,表示缓冲区的大小为128字节。 -
char buffer[BUFFER_SIZE];
:创建了一个字符数组buffer
,作为接收数据的缓冲区,大小由BUFFER_SIZE
指定。 -
int index = 0;
:定义了一个整数变量index
,用于跟踪缓冲区中当前存储位置(索引),初始值为0。
setup() 函数
-
Serial.begin(9600);
:初始化串口通信,设置波特率为9600。波特率是指每秒传输的比特数,是串口通信中的一个重要参数。 -
Serial.println("虽然听不懂,老师讲得也烂,但我们超级喜欢单片机这门课呢!!!");
:通过串口发送一条消息,表示程序已经启动并正在运行。
loop() 函数
这是一个无限循环的函数,Arduino程序的主要逻辑通常放在这里。
if (Serial.available() > 0) {
:检查串口是否有数据可读。Serial.available()
函数返回串口缓冲区中可读数据的字节数。如果大于0,表示有数据可读。char incomingByte = Serial.read();
:从串口读取一个字节的数据,并将其存储在变量incomingByte
中。if (index < BUFFER_SIZE - 1) {
:检查缓冲区是否还有空间存储新的数据。因为要在字符串末尾添加一个空字符(\0
)作为字符串结束的标志,所以要留出一个字节的空间。
buffer[index++] = incomingByte;
:将读取的字节存储到缓冲区中,并递增索引以指向下一个存储位置。if (incomingByte == '\n') {
:检查读取的字节是否是换行符(\n
)。如果是,表示接收到了一个完整的字符串。
buffer[index] = '\0';
:在缓冲区末尾添加空字符(\0
),标记字符串的结束。这对于C语言中的字符串处理函数是必要的。- 计算字符串的字符数(不包括结尾的
\0
),并打印接收到的字符串及其字符数。 index = 0;
:清空缓冲区索引,准备接收下一个字符串。
} else {
:如果缓冲区满了,打印错误消息,并清空缓冲区索引。
Serial.println("爆了吧,哔哔的缓冲区都炸了,罪孽啊...");
:打印错误消息。index = 0;
:清空缓冲区索引。
总结
这段代码演示了如何使用Arduino的串口功能接收数据,并将其存储在缓冲区中直到接收到换行符为止。然后,它会处理接收到的字符串(例如,打印出来并计算字符数),并清空缓冲区以准备接收新的数据。这是单片机编程中常见的串口通信处理方式之一,可以用于与计算机或其他串口设备进行数据交换。