2 votes

avr c : création d'un son clignotant / bip basé sur les caractères d'une chaîne de caractères

J'essaie de créer un bip sonore à partir des caractères d'une chaîne de caractères. Voici le code :

/*
 * Buzzer connected to Arduino uno digital pin 13
 * Switch connected to digital pin 2
 */ 

#include <avr/io.h>
#include <util/delay.h>

const int TBEEP = 1000;
const int TBEEEEP = 3500;
const int TGAP = 500;
const int TGAPLETTER = 2000;
int portb = 0x20;

void beep() {
    PORTB = ~portb; _delay_ms(TGAP);
    PORTB = portb; _delay_ms(TBEEP);
    PORTB = ~portb; _delay_ms(TGAP);
}

void beeeep() {
    PORTB = ~portb; _delay_ms(TGAP);
    PORTB = portb; _delay_ms(TBEEEEP);
    PORTB = ~portb; _delay_ms(TGAP);
}

void gapLetter() {
    PORTB = ~portb; _delay_ms(TGAPLETTER);
}

void morse_S() {
    beep(); beep(); beep();
    gapLetter();
}

void morse_M() {
    beeeep(); beeeep();
    gapLetter();
}

void morse_SMS() {
    morse_S(); morse_M(); morse_S();
}

void morse(char theString[]) {
    for (int i = 0; theString[i] != '\0'; i++)
    {
        if(&theString[i] == "S")
            morse_S();
        else if(&theString[i] == "M")
            morse_M();
    }
}

int main (void)
{
    DDRB = 0xFF;
    DDRD = 0x00;
    PORTD = 0x04;

    while (1) {
        if (PIND & 0x04) {
            PORTB = ~0x20;
        } else {
            //morse_SMS(); // it works
            morse("SMS"); // this one doesnt work like morse_SMS() PLEASE HELP!
        }
    }
    return 0;
}

En fonction void morse(char theString[]) {...} Je souhaite produire un bip sonore à partir de chaque caractère de la chaîne "SMS". Malheureusement, seul le dernier caractère peut le produire.

J'utilise Atmel Studio 6. Lorsque je construis la solution (F7), il n'y a pas d'erreur mais un avertissement que je ne comprends pas (désolé d'être un total noob).

la comparaison avec une chaîne de caractères littérale entraîne un comportement non spécifié [-Waddress].

Comment forcer tous les caractères à émettre un bip l'un après l'autre ?

4voto

Tout d'abord,

const int TBEEP = 1000;
const int TBEEEEP = 3500;

Cela m'a fait plaisir :)


A part cela, vous devriez vraiment vous procurer un bon livre de C pour débutants. Vous ne pouvez pas comparer des chaînes de caractères à l'aide de la fonction == car il compare des pointeurs, et non des contenus. Si vous souhaitez comparer des chaînes de caractères, utilisez l'opérateur strcmp() de la bibliothèque standard C.

Mais.. : dans votre cas, vous ne voulez pas comparer des chaînes de caractères. Vous voulez comparer des caractères. Et cela peut être fait avec == Il suffit de déréférencer le pointeur de caractère pour obtenir le caractère réel, et de le comparer à un littéral de caractère, et non à un littéral de chaîne :

if (theString[i] == 'S')
    morse_S();
else if (theString[i] == 'M')
    morse_M();

Oh, et vous voudrez probablement éviter cette énorme chaîne d'ordinateurs. if...else if...else monstre. En supposant un encodage UTF-8 ou au moins ASCII, où les codes de caractères des lettres anglaises sont classés par ordre alphabétique :

void (*morse_funcs[26])();
morse_funcs[0] = morse_A;
morse_funcs[1] = morse_B;
// ...
morse_funcs[25] = morse_Z;

// ...

void morse(const char *s)
{
    while (*s)
        morse_funcs[tolower(*s++) - 'a']();
}

Remarquez également que j'ai modifié char * en const char * . Si vous ne modifiez pas une chaîne de caractères, vous indiquez au compilateur que vous n'avez pas l'intention de la modifier, ce qui vous permet de passer en toute sécurité des chaînes de caractères littérales.

C'est encore mieux : n'utilise pas une table de pointeurs de fonctions, mais une table de codes morse. Comme ceci :

const char *mcodes[26] = {
    ".-",        // 'a'
    "-...",      // 'b'
    // etc...
    "--.."       // 'z'
};

void do_morse(const char *code)
{
    while (*code)
        if (*code++ == '-')
            beeeep();
        else
            beep();
}

void morse(const char *s)
{
    while (*s)
        do_morse(mcodes[tolower(*s++) - 'a']);
}

0voto

P0W Points 21239

Essayez ceci :

void morse(char theString[]) {
    for (int i = 0; theString[i] != '\0'; i++)
    {
        if(theString[i] == 'S')
            morse_S();
        else if(theString[i] == 'M')
            morse_M();
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X