小白求教:串口控制IO口问题
本帖最后由 laythy 于 2021-7-23 15:56 编辑小白求教:串口控制IO口问题:
想用串口接收数据,判断数据,然后控制IO口高低电平,来控制小车的轮子:ALPHA1脚接的A1,以此类推BETA2接的B2.按照下面的程序,给串口发1或2.3.4,都没反应。另外接的OLED没问题,正常。
#include <Arduino.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_RESET);
int ICByte; // 串口接收数据(1Byte)
#define ALPHA1 2
#define ALPHA2 3
#define BETA1 4
#define BETA2 5
void setup()
{
// put your setup code here, to run once:
pinMode(ALPHA1, OUTPUT);
pinMode(ALPHA2, OUTPUT);
pinMode(BETA1, OUTPUT);
pinMode(BETA2, OUTPUT);
digitalWrite(ALPHA1, LOW);
digitalWrite(ALPHA2, LOW);
digitalWrite(BETA1, LOW);
digitalWrite(BETA2, LOW);
Serial.begin(9600);
Serial.setTimeout(5000);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 设置I2C地址 0x3C
display.clearDisplay(); // 清屏
display.setTextColor(WHITE); // 设置字体颜色 白色(只对Adafruit品牌的OLED有效)
display.display(); // 显示
display.setTextSize(2); // 设置字体大小 2
display.setCursor(0,0); // 设置显示位置(起始点,即左上角坐标)
display.print("Serial OK!");
display.display();
delay(1000);
}
void loop()
{
// put your main code here, to run repeatedly:
digitalWrite(ALPHA1, LOW);
digitalWrite(ALPHA2, LOW);
digitalWrite(BETA1, LOW);
digitalWrite(BETA2, LOW);
if (Serial.available() > 0)
{
ICByte = Serial.read();
display.clearDisplay();
display.setCursor(0,0);
display.print(ICByte);
display.display();
switch(ICByte)
{
case 1 :
digitalWrite(ALPHA1, HIGH);
digitalWrite(ALPHA2, LOW);
digitalWrite(BETA1, HIGH);
digitalWrite(BETA2, LOW);
delay(200);
break;
case 2 :
digitalWrite(ALPHA1, LOW);
digitalWrite(ALPHA2, HIGH);
digitalWrite(BETA1, HIGH);
digitalWrite(BETA2, LOW);
delay(200);
break;
case 3 :
digitalWrite(ALPHA1, LOW);
digitalWrite(ALPHA2, HIGH);
digitalWrite(BETA1, LOW);
digitalWrite(BETA2, HIGH);
delay(200);
break;
case 4 :
digitalWrite(ALPHA1, HIGH);
digitalWrite(ALPHA2, LOW);
digitalWrite(BETA1, LOW);
digitalWrite(BETA2, HIGH);
delay(200);
break;
default:
delay(200);
break;
}
}
else
{
display.clearDisplay();
display.setCursor(0,0);
display.print("Serial is Waiting...");
display.display();
ICByte=0;
}
}
本帖最后由 frankhan747 于 2021-7-24 22:16 编辑
注意串口传输的数据类型。
串口监视器、串口助手这种东西一般会把你输入的内容当作字符发送出去。即使是纯数字,也会被拆成字符(举例:你想输入整型数据255,串口监视器实际发送的是'2', '5', '5' 三个字符。函数Serial.read()每运行一次只能从缓存区读取1个字符)。给2种修改思路
1. 把case 1: 和 case 2: 改成 case '1': 和 case '2': (整数换成字符);
2. 调一个<HardwareSerial.h>库(IDE应该会自带)用Serial.parseInt()从串口缓存区里抓取1个整型数据再扔到switch-case里。同时设法让串口监视器/助手发送整型数据而非字符型数据
页:
[1]