Portál AbcLinuxu, 9. května 2025 20:39
/* compass.c #include <errno.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <linux/i2c-dev.h> /* Note that the documentation for the compass states its address as 0xC0. * However, this includes the low bit which specifies read or write. * Linux i2c does not include this bit in this address, so the actual * address is 0xC0 shifted down, 0x60. */ #define CMPS03_ADDR 0x60 /* The important registers on the compass. Internal/test registers omitted. */ #define CMPS03_SOFTWARE_REVISION 0x0 #define CMPS03_BEARING_BYTE 0x1 #define CMPS03_BEARING_WORD_HIGH 0x2 #define CMPS03_BEARING_WORD_LOW 0x3 #define CMPS03_CALIBRATE_CMD 0xF int main(int argc, char *argv[]) { char *end; int res,file; int e1; char filename[20] ; long funcs; int heading_byte, heading_word_h, heading_word_l; int bearing_long, bearing_degrees; sprintf(filename,"/dev/i2c-0"); if ((file = open(filename,O_RDWR)) < 0) { e1 = errno; if (e1 != ENOENT) { fprintf(stderr,"Error: Could not open file '%s' : %sn", filename,strerror(e1)); if(e1 == EACCES) fprintf(stderr,"Run as root?n"); } } /* Get software revision number */ res = i2c_smbus_read_byte_data(file, CMPS03_SOFTWARE_REVISION); if (res < 0) { printf("Cannot read software revision leveln"); } else { printf("Software revision level: %02xn", res); } /* Loop and read from the compass. */ while (1) { /* The heading byte is 0-255 for the 360 degrees. */ heading_byte = i2c_smbus_read_byte_data(file, CMPS03_BEARING_BYTE); if (heading_byte < 0) { printf("Error reading from compass."); exit(1);} /* The high resolution heading is given in two registers, and is 10 * the * heading in degrees, ie 359.9 degrees reads as 3599. */ heading_word_h = i2c_smbus_read_byte_data(file, CMPS03_BEARING_WORD_HIGH); if (heading_word_h < 0) { printf("Error reading from compass."); exit(1);} heading_word_l = i2c_smbus_read_byte_data(file, CMPS03_BEARING_WORD_LOW); if (heading_word_l < 0) { printf("Error reading from compass."); exit(1);} /* Combine the two bytes, and get the heading in degrees. */ bearing_long = heading_word_h * 256 + heading_word_l; bearing_degrees = bearing_long / 10; printf("Bearing: %d \n", bearing_degrees); /* Wait for a while. */ usleep(200000); } }Kompilace vyhodí vždy tyto chyby:
[honza@AMD2000 ~]$ cc i2c.c i2c.c:97:2: warning: no newline at end of file /tmp/ccNQKa9S.o: In function `main': i2c.c:(.text+0xbe): undefined reference to `i2c_smbus_read_byte_data' i2c.c:(.text+0xfb): undefined reference to `i2c_smbus_read_byte_data' i2c.c:(.text+0x12f): undefined reference to `i2c_smbus_read_byte_data' i2c.c:(.text+0x163): undefined reference to `i2c_smbus_read_byte_data' collect2: ld returned 1 exit statusNevíte někdo co s tím?
(collect2: ld returned 1 exit status)
zkuste pridat parametr -li2c (nebo neco v tom smyslu - pridani i2c knihovny)
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.