Sida 1 av 1
GCC - linux, bibliotekhantering
Postat: 14 december 2009, 13:05:05
av Anonym2
Hej
Jag håller på att trassla lite med GCC på min Ubuntu dator. Jag försöker få ett program att kunna läsa/skriva från/till serieporten. Jag har hittat en guide för det hela på
http://www.captain.at/howto-simple-seri ... xample.php.
Men jag begriper inte hur jag ska använda filerna där riktigt. Där är 2st filer, en som heter capser.h och en capser.c, capser.h har jag förstått ska läggas i /usr/include/ eller i en underkatalog till den i detta fall. Men capser.c? kan den ligga i samma katalog som själva programfilen som komplileras?
//Alexander
Re: GCC - linux, bibliotekhantering
Postat: 14 december 2009, 13:23:31
av Illuwatar
sertar.gz-filen som du kan ladda ner innehåller fyra filer. Packa upp denna utan att ändra strukturen i en temporär katalog. En får en underkatalog med namnet "ser". Gå till nämnda katalog och kör "make" (utan parametrar). Om din miljö är korrekt uppställd skall du se något i denna stil:
linux-ltq0:~/ser # make
gcc -g -c -Wall captain/capser.c -o capser.o
gcc -g -c -Wall ser.c -o ser.o
gcc ser.o capser.o -o ser
När du är klar skall du ha ett litet program som heter "ser". Exempel på körning:
linux-ltq0:~/ser # ./ser
baud=9600
baud=9600
written:ABC
SERIAL EAGAIN ERROR
read failed
(Detta gjordes på en virtuell maskin utan COM-port, därav felmeddelandet).
Jag använde OpenSUSE 11.2, men det borde inte vara skillnad på Ubuntu. Se bara till att vara root, det blir lättare så.
Re: GCC - linux, bibliotekhantering
Postat: 14 december 2009, 13:32:44
av Anonym2
Tack för hjälpen! nu fungerar det som det ska!
//Alexander
Re: GCC - linux, bibliotekhantering
Postat: 16 december 2009, 17:42:51
av hcb
>Se bara till att vara root, det blir lättare så.
Urk, inte utan att ha kikat i makefilen först, väl?
Re: GCC - linux, bibliotekhantering
Postat: 16 december 2009, 18:58:26
av speakman
Allt blir enklare som root; t.ex. att totalt förstöra hela systemet.
Ha som tumregel: Om du tror att du behöver vara root - tänk igen. Och om du absolut måste vara (som vid "make install") så använd sudo.
Re: GCC - linux, bibliotekhantering
Postat: 16 december 2009, 23:39:46
av Glenn
@speakman: Och exakt vad vinner man på att använda sudo i det fallet ??
Sudo har givetvis existensberättigande, men själv använder jag det aldrig, jag har nästan alltid root på alla maskiner
jag använder, och jag har koll på vad jag skriver i rootfönstret och dom vanliga fönstren typ.
..Annars håller jag ju med om principen att man ska försöka göra så lite som möjligt som root.
Re: GCC - linux, bibliotekhantering
Postat: 17 december 2009, 13:48:14
av speakman
Poängen med sudo är att man inte "råkar" vara root vid olämpliga tillfällen. Med sudo utför man *en* uppgift som root, sedan är man tillbaka till användaren igen. Ett mönster som är väldigt vettigt att hålla.
Re: GCC - linux, bibliotekhantering
Postat: 17 december 2009, 14:02:41
av Glenn
Visst, men joe luser kommer ju att skriva sudo framför varje kommado som inte funkade utan.. visst, man kan ha listor osv, men då kräver det ju att nån annan tänker först.
..Och har man koll kommer man ju ändå bara att sua /byta fönster när det behövs.
Re: GCC - linux, bibliotekhantering
Postat: 17 december 2009, 17:50:59
av Graj
Eller så skriver du su -c 'kommando'
Då utförs bara ett kommando som root sedan är man åter vanlig användare.
Re: GCC - linux, bibliotekhantering
Postat: 17 december 2009, 19:31:30
av speakman
Graj: Och på vilket vis skiljer det från sudo? Det är väl snarare exakt vad sudo gör, fast lite mer flexibelt och enklare?
Glenn: Må hända att man provar med sudo, men det är fortfarande ett smidigt verktyg även för power users. Eller kanske snarast för power users?
Re: GCC - linux, bibliotekhantering
Postat: 18 december 2009, 19:47:44
av Anonym2
Hej
Nu har jag lite meck med pekare, till en char. programm-snutten ser ut så här:
Kod: Markera allt
usleep(500000);
char sResult[254];
fcntl(fd, F_SETFL, FNDELAY); // don't block serial read
if (!readport(fd,sResult)) {
printf("read failed\n");
close(fd);
}
printf("readport=%s\n", sResult);
close(fd);
gl_write(120,140,sResult[0]);
gl_write(120,160,sResult[1]);
}
Jag vill alltså ta ut dom två första tecknen i char vektorn, och skriva till skärmen. Men jag får då felet:
Kod: Markera allt
ser.c: In function ‘main’:
ser.c:88: warning: passing argument 3 of ‘gl_write’ makes pointer from integer without a cast
/usr/include/vgagl.h:156: note: expected ‘char *’ but argument is of type ‘char’
ser.c:89: warning: passing argument 3 of ‘gl_write’ makes pointer from integer without a cast
/usr/include/vgagl.h:156: note: expected ‘char *’ but argument is of type ‘char’
Om jag kör programmet krashar det på segmenteringsfel...
Om jag istället skriver om koden till
Kod: Markera allt
gl_write(120,140,&(sResult[0]));
gl_write(120,140,&(sResult[1]));
så kompilerar den utan knyssel, men presenterar inte den första respektive andra tecknet från sResult, utan samtliga fyra, och den undre dom sista 3.
Jag har inte direkt någon större inblick i pekare och sådant, som ni kanske förstår, förmodligen ett fundamentalt fel...
Någon som vet?
//Alexander
Re: GCC - linux, bibliotekhantering
Postat: 18 december 2009, 19:54:51
av Nerre
Såvitt jag minns är det så här.
När man skriver ut en sträng i C så ger man funktionen en pekare till början av strängen (normalt bara en pekare till en char, att det är en sträng får man så att säga hålla reda på själv) och den skriver tills den hittar ett NULL. Vill man skriva ett tecken så får man antingen göra en 1-teckens sträng (tecknet följt av NULL) eller använda en funktion som just skriver ut en char.
Re: GCC - linux, bibliotekhantering
Postat: 18 december 2009, 20:44:08
av speakman
Precis så är det. Vilket också är anledningen till dina fel.
Re: GCC - linux, bibliotekhantering
Postat: 20 december 2009, 15:24:28
av arvidb
Ditt första försök
Kod: Markera allt
gl_write(120,140,sResult[0]);
gl_write(120,160,sResult[1]);
är syntaktiskt rätt, problemet är bara att gl_write() förväntar sig en sträng (char *) och inte ett tecken (char) som inparameter. Försök hitta någon annan funktion som skriver ut bara en char.
Alternativt kan du göra nåt stil med
Kod: Markera allt
{
char sResult[254];
char sTmp[2];
fcntl(fd, F_SETFL, FNDELAY); // don't block serial read
if (!readport(fd,sResult)) {
printf("read failed\n");
close(fd);
}
printf("readport=%s\n", sResult);
close(fd);
sTmp[1] = '\0';
sTmp[0] = sResult[0];
gl_write(120,140,sTmp);
sTmp[0] = sResult[1];
gl_write(120,160,sTmp);
}
Re: GCC - linux, bibliotekhantering
Postat: 23 december 2009, 03:18:38
av Anonym2
Tackar för hjälpen! nu fungerar det som det ska!
//Alexander