[C] elke keer opnieuw karakter lezen

Status
Niet open voor verdere reacties.

gieterke

Gebruiker
Lid geworden
22 apr 2008
Berichten
52
[C] elke keer opnieuw karakter lezen : probleem met struct

Hallo iedereen,
Ik ben een programma aan het schrijven om de seriële poort aan te sturen. Het moet dan ook de status printen van de 8kanalen die ik aanstuur in de microcontroller waar ik dit naartoe stuur. Het komt erop neer dat ik telkens een letter stuur naar een microcontroller met bv a voor hoog en q voor laag voor kanaal1. Nu is het probleem dat ik telkens ik een letter induw, het lijkt alsof mijn variabele output direct wordt gewijzigd. Weet iemand de oplossing? Alvast bedankt.
Dieter

Code:
char kanaal1; 
char kanaal2;
char kanaal3;
char kanaal4;
char kanaal5;
char kanaal6;
char kanaal7;
char kanaal8;

void buttons_print(){ //print welke toetsen nodig zijn om de status te veranderen
printf("kanaal1: a = hoog, q = laag, w = puls\n");
printf("kanaal2: z = hoog, s = laag, x = puls\n");
printf("kanaal3: e = hoog, s = laag, c = puls\n");
printf("kanaal4: r = hoog, d = laag, v = puls\n");
printf("kanaal5: t = hoog, g = laag, b = puls\n");
printf("kanaal6: y = hoog, h = laag, n = puls\n");
printf("kanaal7: u = hoog, j = laag, , = puls\n");
printf("kanaal8: i = hoog, k = laag, ; = puls\n");
printf("Druk op m en enter om af te sluiten\n");
printf("\n");
}

void status_print(char output){ //variabele kanaal blijft verandert
if (output == 'a' || 'q') kanaal1 = output; //leest welk kanaal is veranderd en welke toestand dit heeft gekregen
if (output == 'z' || 's') kanaal2 = output;
if (output == 'e' || 'd') kanaal3 = output;
if (output == 'r' || 'f') kanaal4 = output;
if (output == 't' || 'g') kanaal5 = output;
if (output == 'y' || 'h') kanaal6 = output;
if (output == 'u' || 'j') kanaal7 = output;
if (output == 'i' || 'k') kanaal8 = output;    
    
if(kanaal1 == 'a') printf("kanaal1 = hoog\n"); //print de toestand van elk kanaal
if(kanaal1 == 'q')  printf("kanaal1 = laag\n");
if(kanaal2 == 'z') printf("kanaal2 = hoog\n");
if(kanaal2 == 's') printf("kanaal2 = laag\n");
if(kanaal3 == 'e') printf("kanaal3 = hoog\n");
if(kanaal3 == 'd') printf("kanaal3 = laag\n");
if(kanaal4 == 'r') printf("kanaal4 = hoog\n");
if(kanaal4 == 'f') printf("kanaal4 = laag\n");
if(kanaal5 == 't') printf("kanaal5 = hoog\n");
if(kanaal5 == 'g') printf("kanaal5 = laag\n");
if(kanaal6 == 'y') printf("kanaal6 = hoog\n");
if(kanaal6 == 'h') printf("kanaal6 = laag\n");
if(kanaal7 == 'u') printf("kanaal7 = hoog\n");
if(kanaal7 == 'j') printf("kanaal7 = laag\n");
if(kanaal8 == 'i') printf("kanaal8 = hoog\n");
if(kanaal8 == 'k') printf("kanaal8 = laag\n");  
}

int main(){
kanaal1 = 'q';//zorgt ervoor dat elk kanaal bij het begin laag is
kanaal2 = 's';
kanaal3 = 'd';
kanaal4 = 'f';
kanaal5 = 'g';
kanaal6 = 'h';
kanaal7 = 'j';
kanaal8 = 'k';
char output = 0; 
char output_copy = 0;
_Bool invalid_hComm;
HANDLE hComm;
 hComm = CreateFile("COM1", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); //opent de com-poort voor non-overlapped I/O met schrijftoegang
if (hComm == INVALID_HANDLE_VALUE){ //als hComm niet kan openen
invalid_hComm = 1;
abort;
}
while(output != 'm'){
    if (invalid_hComm == 1) printf("kan COM1 niet openen\n\n"); //print dat hComm niet geopend kan worden als er geen seriële poort aanwezig is
buttons_print(); //print welke toetsen waarvoor dienen
	while (output_copy == output || output_copy == ' '){ //leest welk karakter wordt ingelezen
		output = getchar();
	}
	WriteFile(hComm, &output, 1, NULL, NULL); //schrijft de variabele output naar hComm met als grootte van 1byte
	output_copy = output;
	system("cls"); //wist het scherm
	status_print(output_copy); //print de status
	buttons_print(); //print welke toetsen waarvoor dienen
};
return 0;
}
 
Laatst bewerkt:
[cpp]
if (output == 'z' || 's') kanaal2 = output;
[/cpp]

Bij een constructie als het bovenstaande ga je de steeds de mist in. De oplossing:

[cpp]
if (output == 'z' || output == 's') kanaal2 = output;
[/cpp]

Om de code een stuk leesbaarder/onderhoudbaarder te maken zou ik zelf voor een andere oplossing kiezen. Iets als het onderstaande bijvoorbeeld:

[cpp]
typedef struct {
char waarde, hoog, laag, puls;
} kanaal_t;

const int AANTAL_KANALEN = 8;
// ...
kanaal_t kanaal[] =
{
{'q', 'a', 'q', 'v'},
{'s', 'z', 's', 'x'},
{'p', 'e', 'p', 'c'},
{'d', 'r', 'd', 'v'},
{'g', 't', 'g', 'b'},
{'h', 'y', 'h', 'n'},
{'j', 'u', 'j', ','},
{'k', 'i', 'k', ';'}
};
//...
// buttons_print:
for (i = 0; i < AANTAL_KANALEN; ++i)
printf("Kanaal: %i\thoog: %c, laag: %c, pulse: %c\n", i+1, kanaal.hoog, kanaal.laag, kanaal.puls);

// status_print:
for (i = 0; i < AANTAL_KANALEN; ++i) {
if (c == kanaal.laag || c == kanaal.hoog) kanaal.waarde = c;
printf("Kanaal %i = %s\n", i+1, (kanaal.waarde == kanaal.laag ? "laag" : "hoog"));
}
[/cpp]
 
Laatst bewerkt:
Nu de examens gedaan zijn en ik tijd heb, heb ik eens naar de andere oplossing gekeken. Omdat ik structures ook niet kende heb ik dat eens bekeken en geprobeerd om de oplossing die COD_NL gaf eens zelf te schrijven. Dit heb ik gedaan en ik ben gekomen tot volgende structure:
[CPP]struct _kanaal{char waarde; char hoog; char laag; char puls};
struct _kanaal kanaal[AANTAL_KANALEN] = {
{'q', 'a', 'q', 'w'},
{'s', 'z', 's', 'x'},
{'d', 'e', 'd', 'c'},
{'f', 'r', 'f', 'v'},
{'g', 't', 'g', 'b'},
{'h', 'y', 'h', 'n'},
{'j', 'u', 'j', ','},
{'k', 'i', 'k', ';'}
}; [/CPP]
Hierbij krijg ik op de eerste regel hiervan de foutmelding: [Warning] no semicolon at end of struct.
Wat doe ik verkeerd?
 
Laatst bewerkt:
Je hebt maar één struct nodig, die gebruik je dan in een array.
De _kanaal kanaal[AANTAL_KANALEN] hoort geen struct te zijn omdat het niet een beschrijving van een object is, maar een object zelf is. ;)

[CPP]
struct _kanaal {
char waarde;
char hoog;
char laag;
char puls
};

const _kanaal kanaal[AANTAL_KANALEN] = {
{'q', 'a', 'q', 'w'},
{'s', 'z', 's', 'x'},
{'d', 'e', 'd', 'c'},
{'f', 'r', 'f', 'v'},
{'g', 't', 'g', 'b'},
{'h', 'y', 'h', 'n'},
{'j', 'u', 'j', ','},
{'k', 'i', 'k', ';'}
}

[/CPP]
 
Laatst bewerkt:
@gerwin3:

1. de fout zit er echter nog steeds in: er staat geen puntkomma achter de variabele 'puls'
2. door de array const te maken wordt de array read-only en kan er dus ook niks veranderd worden = de code werkt niet meer (kanaal.waarde = c wordt dan immers lastig :P)
 
1. de fout zit er echter nog steeds in: er staat geen puntkomma achter de variabele 'puls'
2. door de array const te maken wordt de array read-only en kan er dus ook niks veranderd worden = de code werkt niet meer (kanaal.waarde = c wordt dan immers lastig :P)


Allebei niet gezien :o
 
Dat was inderdaad de oplossing. Nog een laatste vraagje dat ik nog moet weten om de pulsen te laten werken: bij getchar() moet je nog op enter drukken vooraleer het wordt gelezen. Nu zou ik liever hebben dat als ik op een toets druk, deze direct wordt gelezen. Hoe is dit mogelijk?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan