Arduino MKR Wifi 1010 与 Arduino Mega 的串行通信
Arduino MKR Wifi 1010 Serial Communication with Arduino Mega
我正在编写 mkr wifi 1010 和 mega 之间的串行通信程序,其中 mkr 向 mega 发送 H 或 L 字符,mega 通过读取字符并将其板载 LED 设置为高或低取决于字符。当我在 mkr 上使用 delay(#) 时,代码工作正常并且 mega 的 LED 闪烁。
然而,当我创建无延迟代码时,mega 的 led 不会闪烁。它要么保持低位,要么保持高位,大部分时间保持低位。我通过读取串行端口检查了 mkr 代码,它确实在两个版本的代码中以正确的间隔交替发送 72(H) 和 76(L)。
接线图:
MKR Mega
gnd -> gnd
tx -> rx
rx -> tx
我在 mkr 的 rx 引脚之前将 mega 的 tx 引脚电平转换为 3.3v。
mkr延迟代码:
void setup()
{
uint32_t baudRate = 9600;
Serial1.begin(baudRate);
}
void loop()
{
Serial1.print('H');
delay(500);
Serial1.print('L');
delay(500);
}
mkr 无延迟代码:
unsigned long curT = 0;
unsigned long prevT = 0;
const int interval = 500;
int byteToSend = 'L';
void setup()
{
uint32_t baudRate = 9600;
Serial1.begin(baudRate);
}
void loop()
{
curT = millis();
if (curT - prevT > interval)
{
if (byteToSend == 'L')
{
byteToSend = 'H';
}
else
{
byteToSend = 'L';
}
Serial1.print(byteToSend);
prevT = curT;
}
}
兆码:
const int ledPin = 13; // the pin that the LED is attached to
int incomingByte; // a variable to read incoming serial data into
void setup() {
// initialize serial communication:
Serial.begin(9600);
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}
void loop() {
// see if there's incoming serial data:
if (Serial.available() > 0)
{
// read the oldest byte in the serial buffer:
incomingByte = Serial.read();
// if it's a capital H (ASCII 72), turn on the LED:
if (incomingByte == 'H')
{
digitalWrite(ledPin, HIGH);
}
// if it's an L (ASCII 76) turn off the LED:
if (incomingByte == 'L')
{
digitalWrite(ledPin, LOW);
}
}
}
据我所知,这两个不同的 mkr 程序做完全相同的事情并以完全相同的方式发送串行数据,只是一个是阻塞的,一个是非阻塞的。为什么无延迟代码不闪烁?
在delay-less发件人代码中:
int byteToSend
应该是
char byteToSend
并且在接收者代码中:
int incomingByte
应该是
char incomingByte
这解决了问题。
我正在编写 mkr wifi 1010 和 mega 之间的串行通信程序,其中 mkr 向 mega 发送 H 或 L 字符,mega 通过读取字符并将其板载 LED 设置为高或低取决于字符。当我在 mkr 上使用 delay(#) 时,代码工作正常并且 mega 的 LED 闪烁。
然而,当我创建无延迟代码时,mega 的 led 不会闪烁。它要么保持低位,要么保持高位,大部分时间保持低位。我通过读取串行端口检查了 mkr 代码,它确实在两个版本的代码中以正确的间隔交替发送 72(H) 和 76(L)。
接线图:
MKR Mega
gnd -> gnd
tx -> rx
rx -> tx
我在 mkr 的 rx 引脚之前将 mega 的 tx 引脚电平转换为 3.3v。
mkr延迟代码:
void setup()
{
uint32_t baudRate = 9600;
Serial1.begin(baudRate);
}
void loop()
{
Serial1.print('H');
delay(500);
Serial1.print('L');
delay(500);
}
mkr 无延迟代码:
unsigned long curT = 0;
unsigned long prevT = 0;
const int interval = 500;
int byteToSend = 'L';
void setup()
{
uint32_t baudRate = 9600;
Serial1.begin(baudRate);
}
void loop()
{
curT = millis();
if (curT - prevT > interval)
{
if (byteToSend == 'L')
{
byteToSend = 'H';
}
else
{
byteToSend = 'L';
}
Serial1.print(byteToSend);
prevT = curT;
}
}
兆码:
const int ledPin = 13; // the pin that the LED is attached to
int incomingByte; // a variable to read incoming serial data into
void setup() {
// initialize serial communication:
Serial.begin(9600);
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}
void loop() {
// see if there's incoming serial data:
if (Serial.available() > 0)
{
// read the oldest byte in the serial buffer:
incomingByte = Serial.read();
// if it's a capital H (ASCII 72), turn on the LED:
if (incomingByte == 'H')
{
digitalWrite(ledPin, HIGH);
}
// if it's an L (ASCII 76) turn off the LED:
if (incomingByte == 'L')
{
digitalWrite(ledPin, LOW);
}
}
}
据我所知,这两个不同的 mkr 程序做完全相同的事情并以完全相同的方式发送串行数据,只是一个是阻塞的,一个是非阻塞的。为什么无延迟代码不闪烁?
在delay-less发件人代码中:
int byteToSend
应该是
char byteToSend
并且在接收者代码中:
int incomingByte
应该是
char incomingByte
这解决了问题。