Arduinio mega 2560习题-填空、选择和判断-8-UART串口通信_字符串


答案仅供参考,未必正确,请如需使用请核实。


 

第八部分 UART串口通信

填空题

  1. Arduino Mega 2560具有____个硬件UART串口。
    答案:4
  2. 在UART通信中,波特率是指每秒传输的____数。
    答案:比特(位)
  3. 并行通信中,数据是通过____条线路同时传输的。
    答案:多条
  4. 串行通信中,数据是按____顺序一位一位传输的。
    答案:时间
  5. 异步通信中,每个数据包前通常会有一个____信号来标识数据的开始。
    答案:起始位
  6. 同步通信需要____信号来保持发送端和接收端的时钟同步。
    答案:时钟
  7. 在全双工通信中,设备可以同时进行____和____。
    答案:发送;接收
  8. 半双工通信意味着设备在任何时候只能____或____,不能同时进行。
    答案:发送;接收
  9. UART通信中常见的错误检测方式包括奇偶校验和____。
    答案:循环冗余校验(CRC)
  10. Arduino Mega 2560的UART串口默认波特率是____。
    答案:9600
  11. 通过设置寄存器UCSR0A的____位,可以选择UART的数据格式(如8位数据,1位停止位)。
    答案:U2X0
  12. 在UART通信中,停止位的作用是____。
    答案:标识数据包的结束,并提供一定的时间间隔以便接收方准备接收下一个数据包。
  13. Arduino Mega 2560的串口通信可以通过____函数初始化。
    答案:Serial.begin()
  14. 串行通信中,波特率越高,数据传输____越快。
    答案:速度
  15. 使用软件模拟串口(如SoftwareSerial库)时,可以选择Arduino Mega 2560上的____引脚作为RX和TX。
    答案:任意数字

单选题

  1. 下列哪项不是UART通信的特点?
    A. 异步通信
    B. 并行数据传输
    C. 使用起始位和停止位
    D. 可配置波特率
    答案:B
  2. Arduino Mega 2560的哪个函数用于发送一个字符?
    A. Serial.print()
    B. Serial.write()
    C. Serial.read()
    D. Serial.available()
    答案:B
  3. 同步通信与异步通信的主要区别在于?
    A. 数据传输速率
    B. 是否需要时钟信号
    C. 通信距离
    D. 使用的电线数量
    答案:B
  4. 全双工通信与半双工通信的主要区别是什么?
    A. 数据传输速率不同
    B. 通信方向不同
    C. 使用协议不同
    D. 电线数量不同
    答案:B
  5. 下列哪个不是串行通信中常见的错误检测方式?
    A. 奇偶校验
    B. CRC校验
    C. 校验和
    D. 数据加密
    答案:D
  6. Arduino Mega 2560默认的串口通信波特率是?
    A. 4800
    B. 9600
    C. 19200
    D. 115200
    答案:B
  7. 在UART通信中,起始位的作用是?
    A. 标识数据包的开始
    B. 校验数据正确性
    C. 提供时钟信号
    D. 标识数据包的结束
    答案:A
  8. 下列哪个函数用于检查Arduino串口缓冲区中是否有可读数据?
    A. Serial.print()
    B. Serial.read()
    C. Serial.available()
    D. Serial.end()
    答案:C
  9. 使用Arduino的SoftwareSerial库时,可以模拟多少个软件串口?
    A. 1
    B. 2
    C. 3
    D. 无限多个
    答案:B
  10. 并行通信相比串行通信的主要优势是?
    A. 需要的电线更少
    B. 传输速度更快
    C. 成本更低
    D. 更适合远距离传输
    答案:B
  11. UART通信中,数据位通常是几位?
    A. 4
    B. 6
    C. 8
    D. 16
    答案:C
  12. 下列哪个不是影响串口通信稳定性的因素?
    A. 波特率设置
    B. 电线长度
    C. 环境温度
    D. 数据格式
    答案:D
  13. Arduino Mega 2560上的硬件串口编号是从多少开始的?
    A. 0
    B. 1
    C. 2
    D. 3
    答案:A
  14. 在半双工通信中,设备如何切换发送和接收模式?
    A. 自动切换
    B. 手动切换
    C. 同时进行
    D. 不需要切换
    答案:B
  15. 下列哪个不是Arduino串口通信中常用的函数?
    A. Serial.begin()
    B. Serial.println()
    C. Serial.flush()
    D. Serial.close()
    答案:D

判断题

  1. UART通信是同步通信的一种。()
    答案:错
  2. Arduino Mega 2560支持多个硬件UART串口。()
    答案:对
  3. 在串行通信中,波特率越高,数据传输越稳定。()
    答案:错
  4. 并行通信比串行通信需要更多的电线。()
    答案:对
  5. 异步通信不需要时钟信号来同步发送和接收。()
    答案:对
  6. 全双工通信允许设备同时发送和接收数据。()
    答案:对
  7. 半双工通信中,设备不能同时发送和接收数据。()
    答案:对
  8. UART通信中,停止位用于标识数据包的开始。()
    答案:错
  9. Arduino Mega 2560的串口通信波特率可以通过软件调整。()
    答案:对
  10. 使用SoftwareSerial库可以在Arduino Mega 2560上模拟硬件串口。()
    答案:对
  11. 串行通信中,奇偶校验是用来检测数据传输错误的。()
    答案:对
  12. 在UART通信中,数据位只能是8位。()
    答案:错
  13. Arduino Mega 2560的串口通信默认使用硬件串口0。()
    答案:对
  14. 同步通信比异步通信更适合远距离传输。()
    答案:错
  15. 串口通信中,波特率设置不一致会导致通信失败。()
    答案:对

//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的串口功能接收数据,并将其存储在缓冲区中直到接收到换行符为止。然后,它会处理接收到的字符串(例如,打印出来并计算字符数),并清空缓冲区以准备接收新的数据。这是单片机编程中常见的串口通信处理方式之一,可以用于与计算机或其他串口设备进行数据交换。