Sida 1 av 1
AVR C, define "stirng" problem (Löst)
Postat: 17 januari 2011, 16:02:50
av AntiZ
Har problem när jag definierar en sträng i ett macro.
ex.
När jag senare använder denna define i ex.
så får jag ut på terminalen när jag
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
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.
Re: AVR C, define "stirng" problem
Postat: 17 januari 2011, 16:10:02
av hornfeldt
Re: AVR C, define "stirng" problem
Postat: 17 januari 2011, 16:21:34
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...
Re: AVR C, define "stirng" problem
Postat: 17 januari 2011, 17:03:02
av Muppis
Det är inte så enkelt att du bör skriva såhär?
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.
Re: AVR C, define "stirng" problem
Postat: 17 januari 2011, 19:52:22
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?
Re: AVR C, define "stirng" problem
Postat: 18 januari 2011, 13:45:45
av AntiZ
Nu när jag ser Hornfeldts kommentar är det ev. så jag skrev det från början...
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

) 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;
}
Re: AVR C, define "stirng" problem
Postat: 18 januari 2011, 13:54:38
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.
Re: AVR C, define "stirng" problem
Postat: 18 januari 2011, 22:04:43
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?
Re: AVR C, define "stirng" problem
Postat: 18 januari 2011, 22:26:00
av nablaman
Har du provat att kalla makrot nåt annat än VERSION? Kanske är VERSION ett reserverat ord eller makro i avr c.. ?
Re: AVR C, define "stirng" problem
Postat: 19 januari 2011, 12:19:06
av jesse
Jag hänger faktiskt inte med riktigt här ,men:
AntiZ skrev:
När jag senare använder denna define i ex.
så får jag ut på terminalen när jag
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
... 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?
Re: AVR C, define "stirng" problem "(Löst)
Postat: 19 januari 2011, 18:31:16
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.
Re: AVR C, define "stirng" problem (Löst)
Postat: 19 januari 2011, 19:36:18
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
Re: AVR C, define "stirng" problem (Löst)
Postat: 20 januari 2011, 03:16:36
av jesse
nifelheim: skapar den en fil då med koden?
Re: AVR C, define "stirng" problem (Löst)
Postat: 20 januari 2011, 12:18:14
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.