2014-11-19 3 views
0

Я пытаюсь установить время и дату своих часов реального времени, но у него проблемы с чтением данных, которые я вводил на последовательный монитор. В приведенном ниже коде он спрашивает, хочу ли я изменить дату, и я набираю «y» и нажимаю enter. После этого он запрашивает год, и я набираю «14» и нажимаю enter, но ничего не происходит.Байты, которые не читаются в коде Arduino

#include <Wire.h> 
const int DS1307 = 0x68; // Address of DS1307 see data sheets 
const char* days[] = 
{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; 
const char* months[] = 
{"January", "February", "March", "April", "May", "June", "July", "August","September", "October", "November", "December"}; 

// Initializes all values: 
byte second = 0; 
byte minute = 0; 
byte hour = 0; 
byte weekday = 0; 
byte monthday = 0; 
byte month = 0; 
byte year = 0; 

void setup() { 
    Wire.begin(); 
    Serial.begin(9600); 
    delay(2000); // This delay allows the MCU to read the current date and time. 

    Serial.print("The current date and time is: "); 
    printTime(); 
    Serial.println("Please change to newline ending the settings on the lower right of the Serial Monitor"); 
    Serial.println("Would you like to set the date and time now? Y/N"); 

    while (!Serial.available()) delay(10); 
    if (Serial.read() == 'y' || Serial.read() == 'Y') 

    // This set of functions allows the user to change the date and time 
    { 
    Serial.read(); 
    setTime(); 
    Serial.print("The current date and time is now: "); 
    printTime(); 
    } 


    Serial.println("Thank you."); 
} 

// Continuous function for converting bytes to decimals and vice versa 
void loop() { 
} 
byte decToBcd(byte val) { 
    return ((val/10*16) + (val%10)); 
} 
byte bcdToDec(byte val) { 
    return ((val/16*10) + (val%16)); 
} 


// This set of codes is allows input of data 
void setTime() { 
    Serial.print("Please enter the current year, 00-99. - "); 
    year = readByte(); 
    Serial.println(year); 
    Serial.print("Please enter the current month, 1-12. - "); 
    month = readByte(); 
    Serial.println(months[month-1]); 
    Serial.print("Please enter the current day of the month, 1-31. - "); 
    monthday = readByte(); 
    Serial.println(monthday); 
    Serial.println("Please enter the current day of the week, 1-7."); 
    Serial.print("1 Sun | 2 Mon | 3 Tues | 4 Weds | 5 Thu | 6 Fri | 7 Sat - "); 
    weekday = readByte(); 
    Serial.println(days[weekday-1]); 
    Serial.print("Please enter the current hour in 24hr format, 0-23. - "); 
    hour = readByte(); 
    Serial.println(hour); 
    Serial.print("Please enter the current minute, 0-59. - "); 
    minute = readByte(); 
    Serial.println(minute); 
    second = 0; 
    Serial.println("The data has been entered."); 

    // The following codes transmits the data to the RTC 
    Wire.beginTransmission(DS1307); 
    Wire.write(byte(0)); 
    Wire.write(decToBcd(second)); 
    Wire.write(decToBcd(minute)); 
    Wire.write(decToBcd(hour)); 
    Wire.write(decToBcd(weekday)); 
    Wire.write(decToBcd(monthday)); 
    Wire.write(decToBcd(month)); 
    Wire.write(decToBcd(year)); 
    Wire.write(byte(0)); 
    Wire.endTransmission(); 
    // Ends transmission of data 
} 


byte readByte() { 
    while (!Serial.available()) delay(10); 
    byte reading = 0; 
    byte incomingByte = Serial.read(); 
    while (incomingByte != '\n') { 
    if (incomingByte >= '0' && incomingByte <= '9') 
     reading = reading * 10 + (incomingByte - '0'); 
    else; 
    incomingByte = Serial.read(); 
    } 
    Serial.flush(); 
    return reading; 
} 


void printTime() { 
    char buffer[3]; 
    const char* AMPM = 0; 
    readTime(); 
    Serial.print(days[weekday-1]); 
    Serial.print(" "); 
    Serial.print(months[month-1]); 
    Serial.print(" "); 
    Serial.print(monthday); 
    Serial.print(", 20"); 
    Serial.print(year); 
    Serial.print(" "); 
    if (hour > 12) { 
    hour -= 12; 
    AMPM = " PM"; 
    } 
    else AMPM = " AM"; 
    Serial.print(hour); 
    Serial.print(":"); 
    sprintf(buffer, "%02d", minute); 
    Serial.print(buffer); 
    Serial.println(AMPM); 
} 


void readTime() { 
    Wire.beginTransmission(DS1307); 
    Wire.write(byte(0)); 
    Wire.endTransmission(); 
    Wire.requestFrom(DS1307, 7); 
    second = bcdToDec(Wire.read()); 
    minute = bcdToDec(Wire.read()); 
    hour = bcdToDec(Wire.read()); 
    weekday = bcdToDec(Wire.read()); 
    monthday = bcdToDec(Wire.read()); 
    month = bcdToDec(Wire.read()); 
    year = bcdToDec(Wire.read()); 
} 

Update 1:

#include <Wire.h> 
const int DS1307 = 0x68; // Address of DS1307 see data sheets 
const char* days[] = 
{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; 
const char* months[] = 
{"January", "February", "March", "April", "May", "June", "July", "August","September", "October", "November", "December"}; 

// Initializes all values: 
byte second = 0; 
byte minute = 0; 
byte hour = 0; 
byte weekday = 0; 
byte monthday = 0; 
byte month = 0; 
byte year = 0; 

void setup() { 
    Wire.begin(); 
    Serial.begin(9600); 
    delay(2000); // This delay allows the MCU to read the current date and time. 

    Serial.print("The current date and time is: "); 
    printTime(); 
    Serial.println("Please change to newline ending the settings on the lower right of the Serial Monitor"); 
    Serial.println("Would you like to set the date and time now? Y/N"); 

    while (!Serial.available()) delay(10); 
    if (Serial.read() == 'y' || Serial.read() == 'Y') 

    // This set of functions allows the user to change the date and time 
    { 
    Serial.read(); 
    setTime(); 
    Serial.print("The current date and time is now: "); 
    printTime(); 
    } 


    Serial.println("Thank you."); 
} 

// Continuous function for converting bytes to decimals and vice versa 
void loop() { 
} 
byte decToBcd(byte val) { 
    return ((val/10*16) + (val%10)); 
} 
byte bcdToDec(byte val) { 
    return ((val/16*10) + (val%16)); 
} 


// This set of codes is allows input of data 
void setTime() { 
    Serial.print("Please enter the current year, 00-99. - "); 
    year = readByte(); 
    Serial.println(year); 
    Serial.print("Please enter the current month, 1-12. - "); 
    month = readByte(); 
    Serial.println(months[month-1]); 
    Serial.print("Please enter the current day of the month, 1-31. - "); 
    monthday = readByte(); 
    Serial.println(monthday); 
    Serial.println("Please enter the current day of the week, 1-7."); 
    Serial.print("1 Sun | 2 Mon | 3 Tues | 4 Weds | 5 Thu | 6 Fri | 7 Sat - "); 
    weekday = readByte(); 
    Serial.println(days[weekday-1]); 
    Serial.print("Please enter the current hour in 24hr format, 0-23. - "); 
    hour = readByte(); 
    Serial.println(hour); 
    Serial.print("Please enter the current minute, 0-59. - "); 
    minute = readByte(); 
    Serial.println(minute); 
    second = 0; 
    Serial.println("The data has been entered."); 

    // The following codes transmits the data to the RTC 
    Wire.beginTransmission(DS1307); 
    Wire.write(byte(0)); 
    Wire.write(decToBcd(second)); 
    Wire.write(decToBcd(minute)); 
    Wire.write(decToBcd(hour)); 
    Wire.write(decToBcd(weekday)); 
    Wire.write(decToBcd(monthday)); 
    Wire.write(decToBcd(month)); 
    Wire.write(decToBcd(year)); 
    Wire.write(byte(0)); 
    Wire.endTransmission(); 
    // Ends transmission of data 
} 


byte readByte() { 
    byte reading = 0; 
    while (!Serial.available()) delay(10); 

    byte incomingByte = Serial.read(); 
    while (incomingByte != '\r') { 
    if (incomingByte >= '0' && incomingByte <= '9') 
     reading = reading * 10 + (incomingByte - '0'); 
    else; 
    incomingByte = Serial.read(); 
    } 
    //Serial.flush(); 
    return reading; 
} 


void printTime() { 
    char buffer[3]; 
    const char* AMPM = 0; 
    readTime(); 
    Serial.print(days[weekday-1]); 
    Serial.print(" "); 
    Serial.print(months[month-1]); 
    Serial.print(" "); 
    Serial.print(monthday); 
    Serial.print(", 20"); 
    Serial.print(year); 
    Serial.print(" "); 
    if (hour > 12) { 
    hour -= 12; 
    AMPM = " PM"; 
    } 
    else AMPM = " AM"; 
    Serial.print(hour); 
    Serial.print(":"); 
    sprintf(buffer, "%02d", minute); 
    Serial.print(buffer); 
    Serial.println(AMPM); 
} 


void readTime() { 
    Wire.beginTransmission(DS1307); 
    Wire.write(byte(0)); 
    Wire.endTransmission(); 
    Wire.requestFrom(DS1307, 7); 
    second = bcdToDec(Wire.read()); 
    minute = bcdToDec(Wire.read()); 
    hour = bcdToDec(Wire.read()); 
    weekday = bcdToDec(Wire.read()); 
    monthday = bcdToDec(Wire.read()); 
    month = bcdToDec(Wire.read()); 
    year = bcdToDec(Wire.read()); 
} 

ответ

1

Есть несколько проблем.

У вас есть дополнительный Serial.read() до звонка до setTime();. Это потеряет байт.

В readByte() вы можете возвращать int вместо байта, но настоящая проблема заключается в том, что вы должны объявлять byte reading = 0; вне цикла. Он получает значения 0 по ошибке за каждую итерацию цикла.

Serial.flush() предназначено для промывки исходящих данных с Arduino 1.0. Похоже, вы хотите сбросить входящий буфер, что больше не работает.

Проблема с замерзанием, вероятно, связана с петлей внутри readByte(). Некоторые терминалы включают символ '\n' в конце строки, но некоторые используют '\r', а некоторые используют оба. Вы можете попробовать проверить '\r' и проигнорировать '\n'. Ваша программа может долго ждать бесконечного символа новой строки, который никогда не будет отправлен!

+0

Поэтому я удалил лишний 'Serial.read()', я объявил 'byte reading = 0;' после 'byte year = 0;', я закомментировал 'Serial.flush()' и изменил '' \ n '' '' \ r'' в 'readByte()', но у меня все еще есть проблемы. – SuperAdmin

+0

Обновите свой вопрос до последней версии и опишите новые проблемы. На самом деле вам может понадобиться 'Serial.read()'; похоже, что он потребляет символ «\ r». Объявите 'byte reading = 0;' внутри функции readByte(), но выше цикла. Если вы объявите его глобально, тогда он не будет установлен в 0, когда это необходимо. – UncleO

+0

Я разместил обновленный код – SuperAdmin

Смежные вопросы