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

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

Code Review用户
提问于 2020-03-14 16:22:06
回答 1查看 125关注 0票数 1

赋值描述

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

布线

Common协议头文件

代码语言:javascript
复制
#define SYNCHRONIZE "SYN"
#define SYNACK "SYN-ACK"
#define ACKNOWLEDGED "ACK"

#define BAUDRATE 9600
#define TIMEOUT 10

主头文件

代码语言:javascript
复制
#define MASTERPINS 2, 3
#define MASTEREVENT 50

码主Arduino

代码语言:javascript
复制
#include 
#include 
#include "Protocol.h"
#include "Master.h"
SoftwareSerial serial(MASTERPINS); // RX, TX

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

void loop()
{
    static String readString;    // String containing serial data
    static bool sendACK = false; // Boolean regulating handshaking

    /* 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 == SYNACK)
        {
            sendACK = true;
        }
    }

    unsigned long currentTime = millis();  // Set current time
    static unsigned long previousTime = 0; // Set previous time

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

从头文件

代码语言:javascript
复制
#define SLAVEPINS  8, 9

#define SLAVEEVENT 200

#define REDLED1 2
#define YELLOWLED1 3
#define GREENLED1 4

#define REDLED2 5
#define YELLOWLED2 6
#define GREENLED2 7

码从Arduino

代码语言:javascript
复制
#include 
#include 
#include "Protocol.h"
#include "Slave.h"
SoftwareSerial serial(SLAVEPINS); // RX, TX

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(BAUDRATE);     // SoftwareSerial connection (baudrate 9600)
    serial.setTimeout(TIMEOUT); // Maximum wait time
}

void loop()
{
    static String readString;     // String containing serial data
    static long counter = 0;      // Counter
    static bool setLight = false; // Turn lights on once

    unsigned long currentTime = millis();  // Set current time
    static unsigned long previousTime = 0; // Set previous 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 == SYNCHRONIZE)
        {
            serial.print(SYNACK);
        }
        else if (readString == ACKNOWLEDGED)
        {
            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) > SLAVEEVENT && !setLight)
    {
        digitalWrite(REDLED1, HIGH);
        digitalWrite(REDLED2, HIGH);
        digitalWrite(YELLOWLED1, LOW);
        digitalWrite(YELLOWLED2, LOW);
        digitalWrite(GREENLED1, LOW);
        digitalWrite(GREENLED2, LOW);
        counter = 0;
        setLight = true;
    }
}

Please给我反馈了我的代码,以及哪些部分我可以做得更好和/或更有效率。谢谢!

EN

回答 1

Code Review用户

回答已采纳

发布于 2020-03-14 18:21:56

Separate引脚定义

更清晰更容易维护。

代码语言:javascript
复制
//#define SLAVEPINS  8, 9
//SoftwareSerial serial(SLAVEPINS); // RX, TX

#define SLAVEPINS_RX  8
#define SLAVEPINS_TX  9
SoftwareSerial serial(SLAVEPINS_RX, SLAVEPINS_TX);

Code警卫

代码语言:javascript
复制
#ifndef _SLAVE_H
#define _SLAVE_H 1

#define SLAVEPINS  8, 9
#define SLAVEEVENT 200
....

#endif

还请参见#pragma once

名称空间控件的Suggest前缀

考虑文件名

代码语言:javascript
复制
//#define SLAVEEVENT 200
//#define REDLED1 2
//#define REDLED2 5
#define SLAVE_EVENT 200
#define SLAVE_REDLED1 2
#define SLAVE_REDLED2 5

<#>Use标准头文件

代码在static bool sendACK中使用D5,但缺少所需的包含。不要依赖其他的包含来提供这个定义。

代码语言:javascript
复制
#include 

Use单位

50什么?微型,米莉,几秒钟?

代码语言:javascript
复制
// #define MASTEREVENT 50
#define MASTEREVENT 50 /* ms */

Hardware idea

而不是两个腿的LED热,放置一个在地面和电阻在热的一面。更安全和更常见的可使用的部分(灯)有一边的地面。

///

也许以后会更多。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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