(一)简介
Arduino Uno的串口接收(RX)和发送(TX)功能是其与其他设备进行数据交换的重要途径。以下是对这两个功能的详细解释:

一、串口接收(RX)

  • 功能
    • 串口接收(RX)引脚用于接收外部设备发送给Arduino Uno的数据。
  • 应用场景
    • 当Arduino Uno需要从其他设备(如传感器、其他微控制器等)获取数据时,就会通过RX引脚接收这些数据。
    • 例如,一个温度传感器通过串口将温度数据发送给Arduino Uno,Arduino Uno就可以通过RX引脚接收这些数据,并进行进一步的处理或显示。

二、串口发送(TX)

  • 功能
    • 串口发送(TX)引脚用于将Arduino Uno上的数据发送出去。
  • 应用场景
    • 当Arduino Uno需要将数据发送给其他设备(如计算机、其他微控制器、显示器等)时,就会通过TX引脚发送这些数据。
    • 例如,Arduino Uno可以将传感器采集到的数据通过TX引脚发送给计算机,以便在计算机上进行实时显示或存储。

三、串口通信的作用

  • 数据传输
    • 串口通信允许Arduino Uno与其他设备进行双向数据传输,这是实现设备间交互和数据共享的基础。
  • 设备控制
    • 通过串口通信,Arduino Uno可以接收来自其他设备的控制指令,并根据指令执行相应的操作。例如,一个遥控器可以通过串口向Arduino Uno发送指令,控制其连接的电机转动或停止。
  • 调试与监视
    • 在开发过程中,开发者可以使用Arduino IDE内置的串口监视器来监视和调试Arduino Uno与计算机之间的串口通信。这有助于发现潜在的问题并进行修复。
  • 扩展功能
通过串口通信,Arduino Uno可以与其他模块(如蓝牙、WIFI等)进行连接,从而实现更广泛的通信和控制功能。例如,通过蓝牙模块,Arduino Uno可以与手机或平板电脑进行无线通信,实现远程控制或数据传输。


(二)程序
我们在arduino中可以用内置的,串口通信库

Serial库
1. 串口初始化与配置
  • Serial.begin(speed, config)
    • 功能:初始化串口通信,并设置波特率(speed)和数据格式(config,如数据位、校验位、停止位)。
    • 参数
      • speed:波特率,可选值包括300、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200等。
      • config:数据格式,如Serial_8N1表示8个数据位、无校验位、1个停止位。
    • 示例:Serial.begin(9600); // 初始化串口,设置波特率为9600。
  • Serial.end()
    • 功能:禁用串口,释放串口所占用的引脚供其他用途(如数字IO)。
    • 参数:无。

2. 串口缓存管理

  • Serial.flush()
    • 功能:在Arduino 1.0之前的版本中用于清空串口缓存,但在后续版本中改为等待输出数据传送完毕。若需清空缓存,可使用while(Serial.read() >= 0);。
    • 参数:无。
  • Serial.available()
    • 功能:返回串口缓冲区中当前剩余的字符个数。
    • 参数:无。
    • 返回值:整数,表示缓冲区中可读字节的数量。

3. 串口数据读写

  • Serial.read()
    • 功能:从串口缓冲区读取一个字节的数据,并删除已读数据。
    • 参数:无。
    • 返回值:整数,表示读取到的字节。当没有可读数据时,返回-1。
  • Serial.peek()
    • 功能:读取串口缓存中的下一个字节,但不从内部缓存中删除该数据。
    • 参数:无。
    • 返回值:整数,表示缓存中的下一个字节。当没有可读数据时,返回-1。
  • Serial.readBytes(buffer, length)
    • 功能:从串口读取指定长度(length)的字符到缓存数组(buffer)中。
    • 参数
      • buffer:用于存储读取数据的缓存数组。
      • length:要读取的字符长度。
    • 返回值:整数,表示实际读取并存入缓存的字符数。
  • Serial.write(val/str/buf, len)
    • 功能:将数据以二进制形式发送到串口。
    • 参数
      • val:单个字节的值。
      • str:字符串数据。
      • buf:数据缓冲区数组。
      • len:指定要发送的数组长度。
    • 返回值:整数,表示通过串口写入的字节数。

4. 串口数据格式化输出

  • Serial.print(val, format)
    • 功能:将格式化后的数据输出到串口。
    • 参数
      • val:要输出的数据。
      • format:数据格式,包括整数类型和浮点型数据的小数点位数等。
    • 示例:Serial.print(78, HEX); // 以十六进制形式输出78。
  • Serial.println(val, format)
    • 功能:与Serial.print()类似,但在输出数据后会自动添加一个换行符。

5. 串口事件处理

  • Serial.serialEvent()
    • 功能:串口中断事件函数。当串口有数据到达时,Arduino会调用此函数来处理数据。通常在此函数内部使用Serial.read()来读取数据。
    • 语法:void serialEvent() { //statements }
    • 参数:无。但函数体内可包含任何有效的语句来处理串口数据。



  程序解析

①设置一个SerialRcvBuf 字符数组,大小为1000个字节,用于存储从串口接收的数据。
再设置一个字符串数据rcvData
  1. char SerialRcvBuf[1000]; <span style="background-color: rgb(255, 255, 255);">String rcvData="";//保存数据</span>
char SerialRcvBuf[1000];
②初始化函数
开启串口,将波特率设置为9600,待会用于输出电压值
  1. void setup() {
  2.   Serial.begin(9600); // 设置波特率为9600
  3. }

③循环函数
如果串口缓冲区还有数据时,先清空之前保存的数据,然后再定义一个字节变量 rcvMark,用于跟踪当前数据在 SerialRcvBuf 中的位置。
当串口缓存区内还有数据,进入while循环,char(Serial.read())每读取一个字节,就保存到 SerialRcvBuf[rcvMark]中,每次while循环都将SerialRcvBuf[rcvMark]加一位 rcvMark++;
当缓存区已经没数据后,将SerialRcvBuf转为String,保存在字符串变量rcvData内
最后,打印变量rcvData
  1. voidloop() {
  2.   if (Serial.available() > 0) {
  3.     memset(SerialRcvBuf, 0, sizeof(SerialRcvBuf));// 先清空buffer
  4.     byte rcvMark=0;
  5.     while(Serial.available() > 0){

  6.     SerialRcvBuf[rcvMark]= char(Serial.read());  
  7.     delay(2);
  8.     rcvMark++;
  9.     }
  10.   //  Serial.println(SerialRcvBuf);
  11.     rcvData = String(SerialRcvBuf); // 执行转换与保存
  12.     Serial.println(rcvData);
  13.   }
  14. }



④实验现象
image.png

⑤完整代码
  1. String rcvData="";//保存数据
  2. char SerialRcvBuf[1000];
  3. void setup() {
  4.   Serial.begin(9600); // 设置波特率为9600
  5. }

  6. void loop() {
  7.   if (Serial.available() > 0) {
  8.     memset(SerialRcvBuf, 0, sizeof(SerialRcvBuf));// 先清空buffer
  9.     byte rcvMark=0;
  10.     while(Serial.available() > 0){
  11.    
  12.     SerialRcvBuf[rcvMark]= char(Serial.read());  
  13.     delay(2);
  14.     rcvMark++;
  15.     }
  16.   //  Serial.println(SerialRcvBuf);
  17.     rcvData = String(SerialRcvBuf); // 执行转换与保存
  18.     Serial.println(rcvData);
  19.   }

  20.   
  21. }