c - Segmentation fault (core dumped) when parsing char data -
i need help. have program read gps , accelerometer data port. programm work : when send 'a' prog receive gps data , send database, when send 'b', prog send accelerometer data , save database too. when runn proggram, gps data success received , send databse accelerometer data canot receive , error "segmentation fault. me resolve prblem..?
int main(void) { int fd; fd = open("/dev/ttyacm0", o_rdwr | o_noctty | o_ndelay); if (fd == -1) { perror("open_port: unable open port "); } else { fcntl(fd, f_setfl, 0); } char a[] = "a"; char b[] = "b"; int n,m,cnt; char in[30]; //char in2[50]; //char *in; //char in2[100]; //in = (char*) malloc(i+1); //if (in == null) exit(1); mysql *conn; const char *localhost = "127.0.0.1"; const char *user = "root"; const char *password = ""; const char *database = "arduino1"; conn = mysql_init(null); // connect database if (!mysql_real_connect(conn, localhost, user, password, database, 0, null, 0)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } for(cnt=0; cnt<5; cnt++) { if (cnt < 1) { sleep(2); n = write(fd, a, sizeof(a)); printf("send : %s \n", a); //terima data gps dari port sleep(1); n = read(fd, in, 100); if (n < 0) { perror("read"); break; } //query gps char c_lat[50],c_lon[50]; tokenizer(in,c_lat,c_lon); //isi nilai gps ke database char query[255]; strcat(query,"insert gps (latitude, longitude) values ("); strcat(query,c_lat); strcat(query,","); strcat(query,c_lon); strcat(query,")"); if (mysql_query(conn, query)); { printf("%s\n", query); } } else { m = write(fd, b, sizeof(b)); printf("send : %s \n", b); //terima data accelerometer dari port sleep(1); m = read(fd, in, 100); in[m] = '\0'; char str[255]; //query accelerometer char c_nilai_x[10],c_nilai_y[10],c_nilai_z[10],c_teg[6]; tokenizer_acm(in,c_nilai_x,c_nilai_y,c_nilai_z,c_teg); //isi nilai accelerometer ke database strcat(str,"insert highcharts_php (x_axis, y_axis, z_axis, tegangan) values ("); strcat(str,c_nilai_x); strcat(str,","); strcat(str,c_nilai_y); strcat(str,","); strcat(str,c_nilai_z); strcat(str,","); strcat(str,c_teg); strcat(str,")"); if (mysql_query(conn, str)); { printf("%s\n", str); } } // close database connection mysql_close(conn); } return 0; }
thank help. still received same error. change likr : int main(void) {
int fd; fd = open("/dev/ttyacm0", o_rdwr | o_noctty | o_ndelay); if (fd == -1) { perror("open_port: unable open port "); } else { fcntl(fd, f_setfl, 0); } char a[] = "a"; char b[] = "b"; int n,m,cnt; char in[50]; mysql *conn; const char *localhost = "127.0.0.1"; const char *user = "root"; const char *password = ""; const char *database = "arduino1"; conn = mysql_init(null); // connect database if (!mysql_real_connect(conn, localhost, user, password, database, 0, null, 0)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } for(cnt=0; cnt<5; cnt++) { if (cnt < 1) { sleep(2); n = write(fd, a, sizeof(a)); printf("send : %s \n", a); //terima data gps dari port sleep(1); n = read(fd, in, 20); if (n < 0) { perror("read"); break; } //query gps char c_lat[10],c_lon[9]; tokenizer(in,c_lat,c_lon); //isi nilai gps ke database char query[255] = "insert gps (latitude, longitude) values ("; strcat(query,c_lat); strcat(query,","); strcat(query,c_lon); strcat(query,")"); if (mysql_query(conn, query)); { printf("%s\n", query); } } else { m = write(fd, b, sizeof(b)); printf("send : %s \n", b); //terima data accelerometer dari port sleep(1); m = read(fd, in, 30); in[m] = '\0'; //query accelerometer char c_nilai_x[8],c_nilai_y[8],c_nilai_z[8],c_teg[4]; tokenizer_acm(in,c_nilai_x,c_nilai_y,c_nilai_z,c_teg); //isi nilai accelerometer ke database char str[255] = "insert highcharts_php (x_axis, y_axis, z_axis, tegangan) values ("; strcat(str,c_nilai_x); strcat(str,","); strcat(str,c_nilai_y); strcat(str,","); strcat(str,c_nilai_z); strcat(str,","); strcat(str,c_teg); strcat(str,")"); if (mysql_query(conn, str)); { printf("%s\n", str); } } // close database connection mysql_close(conn); } return 0;
}
and result when runn program :
send : insert gps (latitude, longitude) values (-6.889760,107.619659) send : b segmentation fault (core dumped)
i need help.... thank you
this error:
char query[255]; strcat(query,"insert gps (latitude, longitude) values (");
as strcat()
requires destination buffer null terminated on entry, , uninitialized. means strcat()
search through query
null character , knows find one, possibly beyond bounds of query
result in strcat()
writing memory should not be. change to:
char query[255] = "insert gps (latitude, longitude) values (";
same error str
later in code.
instead of using multiple strcat()
calls use safer snprintf()
:
char query[255]; int result = snprintf(query, 255, "insert gps (latitude, longitude) values (%s,%s)", c_lat, c_lon); /* see following paragraph explanation of condition. */ if (result > 0 && result < 255) { }
snprintf()
return value (from section 7.19.6.5 snprintf function of c99 standard):
the snprintf function returns number of characters have been written had n been sufficiently large, not counting terminating null character, or negative value if encoding error occurred. thus, null- terminated output has been written if , if returned value nonnegative , less n.
Comments
Post a Comment