PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : gcc Fehlermeldung



Bjoern
06-08-2002, 14:14
Hallo!

Bin Linux- und Programmierneuling ( was für ne kombination :D ) und möchte meine serielle Schnittstelle auslesen ( wie so viele!)
Habe mir aus der Serial programming HOWTO unten aufgeführtes Programm abgetippt ( für "canonical input processing", nach dem ich hier im Forum gelesen habe das dieses beispiel auf anhieb funktioniert hätte)...leider tuts nicht :(. Ich bekomme, nach dem ich " gcc -o caninp caninp.cpp" eingegeben habe folgendes mitgeteilt:

caninp.cpp: In function 'int main()':
caninp.cpp:50: implicit declaration of function 'int bzero(...)

Nun habe ich gelesen das ich eventuell noch eine Headerdatei benötige (hier wäre die Frage ob mir einer sagen kann welche, oder/und nen Tipp wo es Infos zu den Headern gibt), oder "meine" Funktion ist falsch ( habe mich halt voll und blindlings auf das HOWTO-Beispiel gestürzt )! Vieleicht habe ich mich aber auch verschrieben...aber ich bin das Beispiel schon 3x durchgegangen und habe mich eigentlich an die Vorlage gehalten. Fragen über Fragen...aber wie heißt es so schön: ...wieso?weshalb?warum? wer nicht fragt bleibt dumm!" ;)

Vielen Dank schon mal!

der Bjoern

So nun wäret ihr dran...ich habe Suse 7.3 mit Kernel 2.4.10 auf einem P4 1,7GHz...fehlt noch was? Sagts mir!






#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>

/*baudrate settings are defined in <asm/termbits.h>, which is included by <termios.h> */
#define BAUDRATE B38400
/* change this definition for the correct port */
#define MODEMDEVICE "/dev/ttyS1"
/* POSIX compliant source */
#define _POSIX_SOURCE 1

#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE;

main()
{
int fd,c, res;
struct termios oldtio,newtio;
char buf[255];
/*
Open modem device for reading and writing and not as controlling tty because we don`t want to get killed
if linenoise sends CTRL-C.
*/
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
if (fd <0) {perror(MODEMDEVICE); exit(-1); }

/* save current serial port settings */
tcgetattr(fd,&oldtio);
/* clear struct for new port settings */


bzero(&newtio, sizeof(newtio));

/*
BAUDRATE : Set bps rate. You could also use cfsetspeed and cfsetospeed.
CRTSCTS : output hardware flow control (only used if the cable has all necessary lines. See sect. 7 of Serial HOWTO)
CS8 : 8n1 (8bit, no parity, 1 stopbit)
CLOCAL : local connection, no modem control
CREAD : enable receiving characters
*/
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;

/* IGNPAR : ignore bytes with parity errors
ICRNL : map CR to NL (otherwise a CR input on the computer will not terminate input)
otherwise make device raw ( no other input processing)
*/
newtio.c_iflag = IGNPAR | ICRNL;

/*
Raw output.
*/
newtio.c_oflag = 0;

/*
ICANON : enable canonical input , disable all echo functionality, and don`t send signals to calling program
*/
newtio.c_lflag = ICANON;

/* initialize all control characters
default values can be found in /usr/include/termios.h, and are given
in the comments, but we don`t need them here
*/
newtio.c_cc[VINTR] =0; /* CTRL-C */
newtio.c_cc[VQUIT] =0; /* CTRL-\ */
newtio.c_cc[VERASE] =0; /* DEL */
newtio.c_cc[VKILL] =0; /* @ */
newtio.c_cc[VEOF] =4; /* CTRL-D */
newtio.c_cc[VTIME] =0; /* inter-character timer unused */
newtio.c_cc[VMIN] =1; /* blocking read until 1 character arrived */
newtio.c_cc[VSWTC] =0; /* '\0' */
newtio.c_cc[VSTART] =0; /* CTRL-Q */
newtio.c_cc[VSTOP] =0; /* CTRL-S */
newtio.c_cc[VSUSP] =0; /* CTRL-Z */
newtio.c_cc[VEOL] =0; /* '\0 */
newtio.c_cc[VREPRINT] =0; /* CTRL-R */
newtio.c_cc[VDISCARD] =0; /* CTRL-U */
newtio.c_cc[VWERASE] =0; /* CTRL-W */
newtio.c_cc[VLNEXT] =0; /* CTRL-V */
newtio.c_cc[VEOL2] =0; /* '\0' */

/* now clean the modem line and activate the settings for the port */
tcflush (fd, TCIFLUSH);
tcsetattr (fd,TCSANOW,&newtio);

/* terminal settings done, now handle input
In this example, inputting a 'z' at the beginning of a line will
exit the program. */
while (STOP==FALSE) { /* loop until we have a terminating condition */

/* read blocks program execution until a line terminating character is
input, even if more than 255 chars are input. If the number
of characters read is smaller than the number of chars availabel,
subsequent reads will return the remaining chars. res will be set
to the actual number of characters actually read.
*/
res = read(fd,buf,255);
buf[res]=0;
printf(":%s:%d\n", buf,res);
if (buf[0]=='z') STOP=TRUE;
}
/* restore the old port settings */
tcsetattr(fd,TCSANOW,&oldtio);
}

tkortkamp
06-08-2002, 14:22
Hi!

Einen Auszug aus der man-page zu bzero:


BZERO(3) Linux Programmer's Manual BZERO(3)

NAME
bzero - write zeros to a byte string

SYNOPSIS
#include <string.h>

void bzero(void *s, size_t n);

DESCRIPTION
The bzero() function sets the first n bytes of the byte
string s to zero.

RETURN VALUE
The bzero() function returns no value.

CONFORMING TO
4.3BSD. This function is deprecated -- use memset in new
programs.

SEE ALSO
memset(3), swab(3)

GNU 1993-04-09 BZERO(3)

Also musst du noch string.h in dein Programm mit einbinden.
Außerdem ist bzero eine alte Funktion, die nicht mehr genutzt werden sollte. Du kannst bzero mit memset ersetzen:


bzero(&newtio, sizeof(newtio));
//wird zu
memset(&newtio, 0, sizeof(newtio));


c ya,
Tobias

tkortkamp
06-08-2002, 14:24
Nochwas:
Infos zu einzelnen Funktionen der C-Libary findest du meistens mit dem Befehl:
man funktionsname

c ya,
Tobias

Bjoern
06-08-2002, 14:51
Hi Tobias!

Danke erstmal für die Infos...

Das mit dem memset habe ich natürlich gleich mal eingehackelt und auch die string.h....nur jetzt kommt das grosse aber: er kennt scheinbar meine string.h nicht ( "undefined or invalid # directive" und diesmal der implicit-Fehler mit memset)...

Kann es sein, das mir hier irgendwas fehlt ( vieleicht liegt mein header auf nem anderen Platz??)


...oder sitzt der Fehler mal wieder vor dem Computer? :D

tkortkamp
06-08-2002, 14:57
Wahrscheinlich hast du die Include-Zeile irgendwie falsch geschrieben. Die muss so aussehen:


#include <string.h>


c ya,
Tobias

Bjoern
06-08-2002, 15:18
... genauso hab ichs geschrieben... :confused:....


aber habe gerade etwas probiert und siehe da es geht! Aber....uiuiui...wie soll ich das beschreiben?...also

1.) ich habe auf 2 Konsolen gearbeitet 1x root und 1x ich als user...kann es da zu Problemen kommen wenn ich da wie ein Derwisch hin und herspringe und mal als root was änder und mal als user?
Habe mich dann komplett abgemeldet und diesesmal alles auf einer Konsole, sprich root, geändert!

(ich tippe ja stark auf diese Variante!)

2.) ich habe die string.h als aller erste Headerdatei aufgeführt!


...dummerweise habe ich diese beiden "Neuerungen" gleichzeitig ausprobiert ( "...und sie wissen nicht was sie tun!" :D)

Für eine kurze Analyse meiner Analyse :) wäre ich dir dankbar!

Ich muß auf jedenfall mal meine Hausaufgaben in Sachen Benutzergruppen und so machen.....

...ich werde dann mal weiter spielen! Mercie vielmals!!!!

tiris
07-08-2002, 16:19
Wegen dem Hin- und Herspringen: Es kann sein, dass dein System (welches Linux denn?, würde ich irgendwie angeben) irgendwo eine Option gesetzt hat, dass du als root, bzw. user aus Sicherheitsgründen manche Sachen nicht kannst. Außerdem gibt es da sowas, dass wenn 2 Leute(User) an einer Konsole arbeiten und einer Besitzer der Datei ist, alles was der andere schreibt verworfen wird, beim Speichern. Ich würde immer nur als 1 User arbeiten, kannst dich ja trotzdem an 2 Konsolen einloggen.

tiris

Bjoern
08-08-2002, 07:03
Hi Tiris!

Danke für deine Info!

Es scheint tatsächlich so gewesen zu sein wie du geschrieben hast. Wie gesagt, ich werde meine Hausaufgaben in diesem Bereich noch machen müssen. Es hat ja nun geklappt...uff!:)....also weiter im Takt.

Gruß Björn