Arduinowilliam hill官网
直播中

jf_22786546

3年用户 4经验值
私信 关注
[问答]

求助:arduino自动接收2次发送?

各位大佬,我想用arduino uno做一个led闪亮程序,现在闪亮频率定义为200Hz,亮的时间定义为占空比,通过占空比计算。

同时该程序通过串口接收一个占空比参数,但是为什么我发送1次占空比参数,arduino会自动补发一次占空比为0的参数呢?

向各位大佬求助。

int ledPin = 13;
int dutyCycle = 50;                          // 默认占空比为50%
int restTime = 1000 / 200 * dutyCycle / 100; // 计算休息时间
int highTime = 5;

void setup()
{
    pinMode(ledPin, OUTPUT);
    // 开启串口通信
    Serial.begin(9600);
    Serial.println(F("++++++++++++++++++++++++++++++++++++"));
    Serial.println(F("++++++++ Wind motor program ++++++++"));Serial.println(F("++++++++++++++++++++++++++++++++++++"));
    Serial.println(F(""));
    Serial.println(F("Please input duty cycle (1-100):"));
}

void loop()
{
    while (Serial.available())
    {
        dutyCycle = Serial.parseInt(); // 读取占空比参数
        if (dutyCycle >= 0 && dutyCycle <= 100)
        {
            restTime = 5 * dutyCycle * 10; // 重新计算休息时间
            highTime = 5000 - restTime;
            Serial.println(F("++++++++++++++++++++++++++++++++++++"));
            Serial.print(F("Recived dutyCycle : "));
            Serial.print(dutyCycle);
            Serial.print(F(" restTime : "));
            Serial.print(restTime);
            Serial.print(F(" highTime : "));
            Serial.println(highTime);
            Serial.println(F("++++++++++++++++++++++++++++++++++++"));
        }
        else
        {
            Serial.println("Invalid duty cycle. Using default value. 0-100");
        }
    }

    digitalWrite(ledPin, HIGH);
    delayMicroseconds(restTime);
    digitalWrite(ledPin, LOW);
    delayMicroseconds(highTime);
}

当我输入一次50时的反应是这样的:
image.png

回帖(1)

jf_22786546

2023-6-27 17:01:35
解决了,是由于arduino IDE自带的串口监视器的问题,其中发送默认带有换行符,因此导致读取不到数字,那么就会默认0输入。
解决方案,修改代码如下:
  1. String inputString = Serial.readStringUntil('\n'); // 读取数字字符串
  2.         if (inputString.length() > 0)
  3.         {
  4.             inputString.trim();                     // 去掉前后空格
  5.             readdutyCycle = inputString.toInt();        // 读取占空比参数,转换为整数
  6.             if (readdutyCycle >= 0 && readdutyCycle <= 100)
举报

更多回帖

发帖
×
20
完善资料,
赚取积分