Arduino Uno的串口接收(RX)和发送(TX)功能是其与其他设备进行数据交换的重要途径。以下是对这两个功能的详细解释:
一、串口接收(RX)
- 功能:
- 串口接收(RX)引脚用于接收外部设备发送给Arduino Uno的数据。
- 串口接收(RX)引脚用于接收外部设备发送给Arduino Uno的数据。
- 应用场景:
- 当Arduino Uno需要从其他设备(如传感器、其他微控制器等)获取数据时,就会通过RX引脚接收这些数据。
- 例如,一个温度传感器通过串口将温度数据发送给Arduino Uno,Arduino Uno就可以通过RX引脚接收这些数据,并进行进一步的处理或显示。
二、串口发送(TX)
- 功能:
- 串口发送(TX)引脚用于将Arduino Uno上的数据发送出去。
- 串口发送(TX)引脚用于将Arduino Uno上的数据发送出去。
- 应用场景:
- 当Arduino Uno需要将数据发送给其他设备(如计算机、其他微控制器、显示器等)时,就会通过TX引脚发送这些数据。
- 例如,Arduino Uno可以将传感器采集到的数据通过TX引脚发送给计算机,以便在计算机上进行实时显示或存储。
三、串口通信的作用
- 数据传输:
- 串口通信允许Arduino Uno与其他设备进行双向数据传输,这是实现设备间交互和数据共享的基础。
- 串口通信允许Arduino Uno与其他设备进行双向数据传输,这是实现设备间交互和数据共享的基础。
- 设备控制:
- 通过串口通信,Arduino Uno可以接收来自其他设备的控制指令,并根据指令执行相应的操作。例如,一个遥控器可以通过串口向Arduino Uno发送指令,控制其连接的电机转动或停止。
- 通过串口通信,Arduino Uno可以接收来自其他设备的控制指令,并根据指令执行相应的操作。例如,一个遥控器可以通过串口向Arduino Uno发送指令,控制其连接的电机转动或停止。
- 调试与监视:
- 在开发过程中,开发者可以使用Arduino IDE内置的串口监视器来监视和调试Arduino Uno与计算机之间的串口通信。这有助于发现潜在的问题并进行修复。
- 在开发过程中,开发者可以使用Arduino IDE内置的串口监视器来监视和调试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()类似,但在输出数据后会自动添加一个换行符。
- 功能:与Serial.print()类似,但在输出数据后会自动添加一个换行符。
5. 串口事件处理
- Serial.serialEvent()
- 功能:串口中断事件函数。当串口有数据到达时,Arduino会调用此函数来处理数据。通常在此函数内部使用Serial.read()来读取数据。
- 语法:void serialEvent() { //statements }
- 参数:无。但函数体内可包含任何有效的语句来处理串口数据。
程序解析
①设置一个SerialRcvBuf 字符数组,大小为1000个字节,用于存储从串口接收的数据。
再设置一个字符串数据rcvData
- char SerialRcvBuf[1000]; <span style="background-color: rgb(255, 255, 255);">String rcvData="";//保存数据</span>
②初始化函数
开启串口,将波特率设置为9600,待会用于输出电压值
- void setup() {
- Serial.begin(9600); // 设置波特率为9600
- }
③循环函数
如果串口缓冲区还有数据时,先清空之前保存的数据,然后再定义一个字节变量 rcvMark,用于跟踪当前数据在 SerialRcvBuf 中的位置。
当串口缓存区内还有数据,进入while循环,char(Serial.read())每读取一个字节,就保存到 SerialRcvBuf[rcvMark]中,每次while循环都将SerialRcvBuf[rcvMark]加一位 rcvMark++;
当缓存区已经没数据后,将SerialRcvBuf转为String,保存在字符串变量rcvData内
最后,打印变量rcvData
- voidloop() {
- if (Serial.available() > 0) {
- memset(SerialRcvBuf, 0, sizeof(SerialRcvBuf));// 先清空buffer
- byte rcvMark=0;
- while(Serial.available() > 0){
- SerialRcvBuf[rcvMark]= char(Serial.read());
- delay(2);
- rcvMark++;
- }
- // Serial.println(SerialRcvBuf);
- rcvData = String(SerialRcvBuf); // 执行转换与保存
- Serial.println(rcvData);
- }
- }
④实验现象
⑤完整代码
- String rcvData="";//保存数据
- char SerialRcvBuf[1000];
- void setup() {
- Serial.begin(9600); // 设置波特率为9600
- }
- void loop() {
- if (Serial.available() > 0) {
- memset(SerialRcvBuf, 0, sizeof(SerialRcvBuf));// 先清空buffer
- byte rcvMark=0;
- while(Serial.available() > 0){
-
- SerialRcvBuf[rcvMark]= char(Serial.read());
- delay(2);
- rcvMark++;
- }
- // Serial.println(SerialRcvBuf);
- rcvData = String(SerialRcvBuf); // 执行转换与保存
- Serial.println(rcvData);
- }
-
- }