AVR C, define "stirng" problem (Löst)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
AntiZ
Inlägg: 321
Blev medlem: 22 februari 2007, 13:34:14
Ort: V. Husby
Kontakt:

AVR C, define "stirng" problem (Löst)

Inlägg av AntiZ »

Har problem när jag definierar en sträng i ett macro.
ex.

Kod: Markera allt

#define VERSION "v0.003"
När jag senare använder denna define i ex.

Kod: Markera allt

rs232_send_string(VERSION);
så får jag ut på terminalen när jag

Kod: Markera allt

#print version<cr>
v0.003

#
Men efter blir alla strängar och liknande fel. Det kommer skräptecken med (verkar vara sista tecknet i strängen före). Även funktionen för att skriva in vad som kommer från terminalen "ballar ur".
Gör jag samma igen

Kod: Markera allt

#print version<cr>
3print version is not a cmd

#
där 3 (verkar) kommer från v0.003.

Gör jag istället

Kod: Markera allt

rs232_send_string("v0.003");
eller

Kod: Markera allt

char ver[7];
strcpy(ver, "v0.003");
rs232_send_string(ver);
så fungerar det även efter utskrift.

Har sett andra exempel på att det ska gå att göra så här, men i mitt fall verkar det som macrosträngar inte riktigt gör som de ska.
Senast redigerad av AntiZ 19 januari 2011, 18:33:25, redigerad totalt 1 gång.
hornfeldt
Inlägg: 104
Blev medlem: 6 maj 2008, 00:27:07
Ort: Örnsköldsvik

Re: AVR C, define "stirng" problem

Inlägg av hornfeldt »

testa

Kod: Markera allt

#define VERSION v0.003
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: AVR C, define "stirng" problem

Inlägg av sodjan »

Men "#define" skapar väl bara en variabel/symbol i själva AVR C (vid build-time)?
Och "#print" är väl något som körs av pre-compilern (vid build-time) !?

De andra funktionsanropen är ju i själva koden och kommer att köras vid run-time.
Den känns som lite hoppblandning av pre-compiler och run-time...
Muppis
Inlägg: 275
Blev medlem: 15 februari 2007, 10:26:28
Ort: Halmstad

Re: AVR C, define "stirng" problem

Inlägg av Muppis »

Det är inte så enkelt att du bör skriva såhär?

Kod: Markera allt

#define VERSION "v0.003\0"
I ditt sista kodexempel sparar du dina sex tecken i en variabel med plats för sju, vilket då ger ett NULL-tecken för att kompilatorn ska veta var strängen tar slut.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: AVR C, define "stirng" problem

Inlägg av stekern »

i så fall skulle man ju behöva skriva rs232_send_string("v0.003\0"); också, vilket man inte behöver.
Verkar dock skumt att rs232_send_string("v0.003"); funkar, men inte rs232_send_string(VERSION);
eftersom det skall vara samma sak.

Edit: så är du säker på att det just inte fungerar med din VERSION, det kan ju vara en tillfällighet att den ballade ur just då.
Hur ser rs232_send_string ut?
Användarvisningsbild
AntiZ
Inlägg: 321
Blev medlem: 22 februari 2007, 13:34:14
Ort: V. Husby
Kontakt:

Re: AVR C, define "stirng" problem

Inlägg av AntiZ »

Nu när jag ser Hornfeldts kommentar är det ev. så jag skrev det från början...

Kod: Markera allt

#define VERSION 0.003
Det jag skrev när det inte fungerade har jag ju inte kvar naturligtvis, men jag skulle kunna (om sonen (3 mån) o sambo (360 mån) tillåter :D ) testa med båda varianterna ikväll.

Det är möjligt att jag inte har testat med #define och "v0.003". Vilket borde vara en direkt ersättning vid kompileringen.

Förtydligande.'#' i #print är bara min prompt i rs232 skalet :) Alltså inte ett kompilatordirektiv. Ursäkta för den klurigheten.

Kod: Markera allt

/* Local functions definitions */
void rs232_show_prompt()
{
    rs232_transmit('\n');
    rs232_transmit('\r');
    rs232_transmit('#');
}
Funktionerna ser ut som följer.

Kod: Markera allt

void rs232_send_string(char *s)
{
    while(*s != '\0')
        rs232_transmit(*s++);
}

void rs232_transmit(unsigned char data )
{
/* Wait for empty transmit buffer */
	while ( !( UCSR0A & (1<<UDRE0)))
	;
/* Put data into buffer, sends the data */
	UDR0 = data;
}
Gimbal
Inlägg: 8685
Blev medlem: 20 april 2005, 15:43:53

Re: AVR C, define "stirng" problem

Inlägg av Gimbal »

AntiZ skrev: men i mitt fall verkar det som macrosträngar inte riktigt gör som de ska.
När saker och ting inte gör som de ska brukar det vara läge att kolla upp vilka optimeringar som är påslagna i kompilatorn.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: AVR C, define "stirng" problem

Inlägg av dangraf »

hur får du processorn att skriva ut "version"?

har du gjort någon form av loop som skriver ut version en massa massa gånger eller är det så att du skickar in ett kommando från terminalen och får version som svar?

jag hänger nämligen inte riktigt med på
#print version<cr>
3print version is not a cmd

#
är det programmet som skriver ut strängen "3print version is not a cmd" från kommandot "#print version<cr>" eller är det dina egna kommentarer?
Användarvisningsbild
nablaman
Inlägg: 480
Blev medlem: 30 juli 2010, 17:43:07
Ort: Lund
Kontakt:

Re: AVR C, define "stirng" problem

Inlägg av nablaman »

Har du provat att kalla makrot nåt annat än VERSION? Kanske är VERSION ett reserverat ord eller makro i avr c.. ?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: AVR C, define "stirng" problem

Inlägg av jesse »

Jag hänger faktiskt inte med riktigt här ,men:
AntiZ skrev:

Kod: Markera allt

#define VERSION "v0.003"
När jag senare använder denna define i ex.

Kod: Markera allt

rs232_send_string(VERSION);
så får jag ut på terminalen när jag

Kod: Markera allt

#print version<cr>
v0.003

#
Men efter blir alla strängar och liknande fel. Det kommer skräptecken med (verkar vara sista tecknet i strängen före). Även funktionen för att skriva in vad som kommer från terminalen "ballar ur".
Gör jag samma igen

Kod: Markera allt

#print version<cr>
3print version is not a cmd

#
där 3 (verkar) kommer från v0.003.

Gör jag istället

Kod: Markera allt

rs232_send_string("v0.003");
... så fungerar det även efter utskrift.
Det är alltså på samma rad i programmet du skriver antingen rs232_send_string(VERSION); eller rs232_send_string("v0.003"); och i första fallet funkar det bara en gång, sedan blir något fel, och i andra fallet fungerar allt bra hela tiden?

Verkar ju lite konstigt. Själv lagrar jag texter i programminnet: #define VER_NR "3.17" och senare i koden: uint8_t PROGMEM welcome[] = "\n [" IDENTITY VERSION "SW] " WEBB "\n";
Jag skriver ut texten med print(welcome);

Och visst skall det gå att ersätta en textsträng med ett macro... Fast jag minns att det inte helt enkelt: det gick inte att göra så här, av naturliga skäl:

Kod: Markera allt

#define VERSION 3.14
print "ver = VERSION";
man var tvungen att göra så här:

Kod: Markera allt

#define VERSION "3.14"
print "ver = " VERSION;
Textsträngen blir då ver = 3.14
Men min misstanke med att du får de konstiga felen i din utskrift är ju att det är något lurigt fel i själva programmet. Varför känner den t.ex. inte igen kommandot "print version" (not a cmd), men ändå tror du att den vill skriva ut v0.003 eftersom det syns en trea i utskriften? Är inte det en motsägelse?

Är det verkligen så att felet bara uppstår när du byter "v0.0003" mot VERSION utan att du ändrar något annat alls? Annat namn på makrot hjälper inte? Funkar programmet verkligen igen om du sätter tillbaks "v0.0003" igen? Du kanske råkat ändra nånstans av misstag i koden när du pysslade med den?

Vilken kompilator är det? GCC?
Användarvisningsbild
AntiZ
Inlägg: 321
Blev medlem: 22 februari 2007, 13:34:14
Ort: V. Husby
Kontakt:

Re: AVR C, define "stirng" problem "(Löst)

Inlägg av AntiZ »

Då ska vi se om jag inte kan svara på allt som kommit upp. Verkar ju så självklart när man skriver.

print version är ett kommando som ska ge utskriften "v0.003". # är min prompt. <cr> är att jag trycker på enter (carrige return). Det är en utskrift från minicom (ett terminalprogram för linux).

#print version<cr>
v0.003

#

När min kommandotolk inte kan tolka ett kommando så svarar den med kommandot som man skrev in och "is not a cmd"
Så i det felaktiga fallet blir det således

#print version<cr>
3print version is not a cmd

#

Men jag har "nog" löst vad felet var, jag måste ha skippat " " runt v0.003 i definitionen. För när jag testar nu med båda varianterna får jag lite konstiga sträng/pekar relaterade fel utan "" och det fungerar bra med "".

Just nu ser det ut som följer i rs232_cmd_handler.h

Kod: Markera allt

#define VERSION "RS232 command handler v0.004"
Version verkar inte vara något reserverat ord iaf.

Jag fick väl för mig att det gick att definera utan "" men det fungerar nog bara för tal, och för definitioner som används vid kompilering typ #ifdef och liknande.
nifelheim
Den första
Inlägg: 2490
Blev medlem: 27 mars 2008, 22:31:16
Ort: stockholm

Re: AVR C, define "stirng" problem (Löst)

Inlägg av nifelheim »

Har du testat kompilera med -E då borde du få se vad preprocessorn knåpar ihop det till.
typ : gcc -E sourcefile.c
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: AVR C, define "stirng" problem (Löst)

Inlägg av jesse »

nifelheim: skapar den en fil då med koden?
nifelheim
Den första
Inlägg: 2490
Blev medlem: 27 mars 2008, 22:31:16
Ort: stockholm

Re: AVR C, define "stirng" problem (Löst)

Inlägg av nifelheim »

Om du bara skriver sådär kommer ut från preprocessorn att hamna på skärmen (standard output)
sedan stannar den. Då ser man exekt vad den stoppar in i koden.

Man kan skriva nåt annat som ger en lista på alla define kommer inte ihåg riktigt vad.
Skriv svar