一、Arduino串口通信
串口(COM口):是Arduino与其他设备进行通信的接口。
Q:连接电脑USB的线为什么可以上传程序,而电源线无法上传?
A:PC一端的数据线接口是USB接口,连接Arduino这一端的接口类型是RS-232转成的TTL232接口。两者指的是电平标准。标准RS-232最高电压达正负15V,计算机串口是标准的RS-232,许多单片机的串口都是TTL电平,电源电压一般为+5V,因此,为了互连,必须进行电平转换。现在的计算机一般没有下图这种串口,就需要一个USB转串口的转换器。而电源线是DC接口,是一种为转变输入电压后有效输出固定电压的接口。
Q:波特率是什么?
A:我们可以把波特率理解为双方通信的速率,接收和发送的速率要保持一致,只有速率保持一致双方进行通信才不会产生数据的损失。波特率一般会设置为9600或115200.波特率也不是越高越好,这跟处理器的主频有关,主频最好是波特率的整数倍,否则会增加错误率。
Q:TX、RX是什么?
A:TX(transport)、RX(receive)是串口通信的引脚。Arduino Uno开发板上,串口位于0(RX)和1(TX)引脚上,经过串口转换芯片(下图黄色位置)连接计算机USB端口与计算机进行通信。使用串口功能的同时不能使用0和1作为输入或输出。
串口相关函数
函数 | 描述 |
Serial.read() | 每次都会返回一个字节的数据,这个返回值便是当前串口读取到的数据。读到后就删除这个数据。 |
Serial.begin(speed) | 设置波特率 |
Serial.available() | 获取串口接收到的数据个数,即获取串口接收缓冲区的字节数 |
Serial.print() | 从串口输出数据 |
Serial.println() | 从串口输出数据,并输入一个换行符 |
Serial.write() | 以字节的形式输出到串口 |
Serial.end() | 结束串口通信 |
例子:输入字符控制LED亮灭
void setup() {
pinMode(8,OUTPUT); //设置引脚8为输出模式
Serial.begin(9600); //设置串口波特率9600
}
int val=0;
void loop() {
val = Serial.read(); //读取计算机发送给控制板的指令复制给val
if(val=='T'){
digitalWrite(8,HIGH); //点亮LED
Serial.println("LED ON"); //并输出
}
if(val=='F'){
digitalWrite(8,LOW); //熄灭LED
Serial.println("LED OFF"); //并输出
}
}
在 “工具” → “串口监视器” 处输入,会显示输出。
二、按键输入
INPUT模式
将引脚设置为输入模式。但此时不能直接与Arduino开发板的GND,和输入电压引脚相连,否则可能会损坏Arduino。而INPUT_PULLUP即输入上拉模式,这里用到了上拉电阻,上拉电阻是当某输入端口未连接设备或处于高阻抗的情况下,一种用于保证输入信号为预期逻辑电平的电阻元件。等效于在该引脚与VCC之间连接了一个电阻,稳定输入输出电平。
例子:按下按键点亮LED,再按一次熄灭LED
int state; //定义按键状态
int last; //按键上一次的状态
int count;
void setup() {
pinMode(13,OUTPUT); //设置为输出模式
pinMode(11,INPUT_PULLUP); //设置为
Serial.begin(9600); //设置波特率
}
void loop() {
state = digitalRead(11); //读取引脚11的状态
if(state != last)
{
if(state)
{
count++;
}
}
last = state; //把这次的状态复制给上一次
if(count%2)
{
digitalWrite(13,HIGH); //点亮
}
else
{
digitalWrite(13,LOW); //熄灭
}
}
电路