小白求教:串口控制IO口问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3556|回复: 1

小白求教:串口控制IO口问题

[复制链接]
发表于 2021-7-23 13:32 | 显示全部楼层 |阅读模式
本帖最后由 laythy 于 2021-7-23 15:56 编辑

小白求教:串口控制IO口问题:
想用串口接收数据,判断数据,然后控制IO口高低电平,来控制小车的轮子:ALPHA1脚接的A1,以此类推BETA2接的B2.按照下面的程序,给串口发1或2.3.4,都没反应。另外接的OLED没问题,正常。

QQ浏览器截图20210723133348.png QQ浏览器截图20210723133445.png




#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;
  }
}


发表于 2021-7-24 22:13 | 显示全部楼层
本帖最后由 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里。同时设法让串口监视器/助手发送整型数据而非字符型数据
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 06:32 , Processed in 0.142243 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表