首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以串行通信为中心的交通灯反馈

以串行通信为中心的交通灯反馈
EN

Code Review用户
提问于 2020-03-13 21:00:57
回答 1查看 147关注 0票数 2

赋值描述

我想收到关于我目前正在做的一项任务的反馈。我得做两个红绿灯,这样才能使交通畅通。我使用一个主Arduino处理主串行通信和一个从Arduino处理光序列。如果Arduino主人断开连接,两盏灯都会变红。我必须使用SoftwareSerial库。情况如下:

配线

码主Arduino

代码语言:javascript
复制
#include <Arduino.h>
#include <SoftwareSerial.h>

SoftwareSerial serial(2, 3); // RX, TX

// Timer
unsigned long currentTime;
unsigned long previousTime = 0;
const unsigned long event = 50;

String readString = ""; // String containing serial data
bool sendACK = false;  // Boolean regulating handshaking

void setup()
{
  Serial.begin(9600); // Native USB connection (baudrate 9600)
  Serial.setTimeout(10);
  while (!Serial)
  {
    ; // Wait for serial port to connect
  }
  serial.begin(9600);    // SoftwareSerial connection (baudrate 9600)
  serial.setTimeout(10); // Maximum wait time
}

void loop()
{
  currentTime = millis(); // Set current time

  /* Set string to incoming data. Once request to 'three-way handshake' has been acknowledged,
  set boolean sendACK to true, allowing "ACK" to be sent. */
  if (serial.available() > 0)
  {
    while (serial.available() > 0)
    {
      readString = serial.readString();
      Serial.print(readString);
    }
    if (readString == "SYN-ACK/")
    {
      sendACK = true;
    }
  }

  /* Send "SYN" to initiate 'three-way handshake'. Once connection established, send "ACK" */
  if ((currentTime - previousTime) > event)
  {
    if (sendACK == false)
    {
      serial.print("SYN/");
      Serial.print("SYN/");
    }
    else if (sendACK == true)
    {
      serial.print("ACK/");
      Serial.print("ACK/");
      sendACK = false;
    }
    previousTime = currentTime;
  }
}

码从Arduino

代码语言:javascript
复制
#include <Arduino.h>
#include <SoftwareSerial.h>

SoftwareSerial serial(8, 9); // RX, TX

// First traffic light LED's
const int redLED1 = 2;
const int yellowLED1 = 3;
const int greenLED1 = 4;

// Second traffic light LED's
const int redLED2 = 5;
const int yellowLED2 = 6;
const int greenLED2 = 7;

long counter = 0; // Counter

bool setLight = false;

// Timer
unsigned long currentTime;
unsigned long previousTime = 0;
const unsigned long event = 200;

String readString = ""; // String containing serial data

void setup()
{
  // Multiple LED outputs
  pinMode(redLED1, OUTPUT);
  pinMode(yellowLED1, OUTPUT);
  pinMode(greenLED1, OUTPUT);
  pinMode(redLED2, OUTPUT);
  pinMode(yellowLED2, OUTPUT);
  pinMode(greenLED2, OUTPUT);

  serial.begin(9600); // SoftwareSerial connection (baudrate 9600)
  serial.setTimeout(10); // Maximum wait time
}

void loop()
{
  currentTime = millis(); // Set current time

  /* Set string to incoming data. Establish 'three-way handshake' and count the amount
  of times handshaking performed. Set lights according to the handshakes counted. */
  if (serial.available() > 0)
  {
    while (serial.available() > 0)
    {
      readString = serial.readString();
    }
    if (readString == "SYN/")
    {
      serial.print("SYN-ACK/");
    }
    else if (readString == "ACK/")
    {
      switch (counter)
      {
      case 0:
        digitalWrite(redLED1, HIGH);
        digitalWrite(redLED2, HIGH);
        break;

      case 10:
        digitalWrite(greenLED1, HIGH);
        digitalWrite(redLED1, LOW);
        break;

      case 40:
        digitalWrite(yellowLED1, HIGH);
        digitalWrite(greenLED1, LOW);
        break;

      case 50:
        digitalWrite(redLED1, HIGH);
        digitalWrite(yellowLED1, LOW);
        break;

      case 60:
        digitalWrite(greenLED2, HIGH);
        digitalWrite(redLED2, LOW);
        break;

      case 90:
        digitalWrite(yellowLED2, HIGH);
        digitalWrite(greenLED2, LOW);
        break;

      case 100:
        digitalWrite(redLED2, HIGH);
        digitalWrite(yellowLED2, LOW);
        break;
      }
      counter++;
      if (counter > 100)
      {
        counter = 0;
      }
    }
    setLight = false;
    previousTime = currentTime;
  }
  // If handshake did not work, wait for 200 milliseconds and set traffic lights to red.
  else if ((currentTime - previousTime) > event && !setLight)
  {
    digitalWrite(redLED1, HIGH);
    digitalWrite(redLED2, HIGH);
    digitalWrite(yellowLED1, LOW);
    digitalWrite(yellowLED2, LOW);
    digitalWrite(greenLED1, LOW);
    digitalWrite(greenLED2, LOW);
    counter = 0;
    setLight = true;
  }
}

请给我反馈我的代码和哪些部分我可以做得更有效率。提前感谢!

EN

回答 1

Code Review用户

回答已采纳

发布于 2020-03-14 03:17:28

使用公共协议文件

任何公共常量,如

  • 九千六百
  • SYNACK等字符串

在一个地方应该是#defined,在本例中,这是两个Arduino项目都可以访问的.h文件。

压痕

从本质上说,单空间缩进从来没有被使用过。通常使用四代。

Globals

在主代码中,所有这些全局应该移动到loop()并声明为static。这样,它们将通过多次调用保持其价值,但其范围也将缩小。

效率

我意识到,其中许多问题可能超出了你的任务范围,不过:

  • 不要使用软件串行;使用硬件串行端口。
  • 不要使用Arduino,使用更适合您的应用程序的小型微控制器。
  • 不要使用ASCII字符串信令;使用单字节常量。如果忠诚度是一个问题,添加一个校验和。
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/238849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档