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

配线

码主Arduino
#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;
}
}#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;
}
}请给我反馈我的代码和哪些部分我可以做得更有效率。提前感谢!
发布于 2020-03-14 03:17:28
任何公共常量,如
SYN、ACK等字符串在一个地方应该是#defined,在本例中,这是两个Arduino项目都可以访问的.h文件。
从本质上说,单空间缩进从来没有被使用过。通常使用四代。
在主代码中,所有这些全局应该移动到loop()并声明为static。这样,它们将通过多次调用保持其价值,但其范围也将缩小。
我意识到,其中许多问题可能超出了你的任务范围,不过:
https://codereview.stackexchange.com/questions/238849
复制相似问题