Ошибка сегментации на RaspberryPi при использовании функций bcm

Итак, у меня есть эта функция (код ниже) в c, которая проверяет данные из моей базы данных. Если эти данные равны 255, я хочу, чтобы светодиод загорался на одном из моих контактов GPIO (12) на Raspberry Pi.

Сначала я попробовал код БЕЗ функций bcm, все работало нормально. Теперь, когда я включил bcm2835 и изменил свой Makefile (компиляция работала нормально), я получаю эту ошибку «Ошибка сегментации».

Я знаю, что это означает, что моя программа использует память, которую она не должна использовать, но я понятия не имею, что вызывает это в строках bcm.

Вот функция:

void check_pasid(char k[]){

MYSQL *conn;
MYSQL_RES * result;
MYSQL_ROW row;



   char *server = "server";
   char *user = "myusername";
   char *password = "mypassword";
   char *database = "dbname";
   char query1[100];

   // Make the connection to the Mysql-database.
   conn = mysql_init(NULL);

   if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0)) {
      fprintf(stderr, "%s\n", mysql_error(conn));
      exit(1);   

   }

sprintf(query1,"SELECT COUNT(*) FROM passcan WHERE UserID = \"%s\";",k);


int result1 = mysql_query(conn, query1);
result = mysql_store_result(conn);
row = mysql_fetch_row(result);

int compare = 1;
compare = strcmp(row[0], "1");

if(compare == 0){
    printf("Led is turning on");
    // Turn it on
    bcm2835_gpio_write(PIN12, HIGH); 
    delay(5000);
    // Turn it off
    bcm2835_gpio_write(PIN12, LOW);
}
else{
    printf("Led is not turning on");
}

}

Я надеюсь, что у кого-то есть информация для меня.


person moffelnijdam    schedule 14.01.2014    source источник
comment
Я надеюсь, что строка в k меньше примерно 50 символов, иначе у вас будет переполнение буфера.   -  person Some programmer dude    schedule 14.01.2014
comment
@JoachimPileborg это   -  person moffelnijdam    schedule 14.01.2014


Ответы (1)


Правильное использование BCM2835
Возможно, здесь будет работать лучше:

#include <bcm2835.h>
// Led on RPi Plug P1 pin 11 (which is GPIO pin 17)
#define PIN RPI_GPIO_P1_11
uint8_t status = LOW;
int SetLed()
{
    // Inizialize the library
    if (!bcm2835_init())
        return 1;
    // Set the pin to be an output
    bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);
    // Set the Led:
    bcm2835_gpio_write(PIN, status);
    status=!status;
    /*
    I fetched a flip-flop variable, problably does not work without integer variable, so replace the up line with
    if (status == HIGH)
       status = LOW;
    else
       status = HIGH;
    */
    //Clean-up and return success.
    bcm2835_close();
    return 0;
}

Я не эксперт, код может быть неправильным, но важной частью является функция bcm2835_init(), bcm2835_gpio_fsel() и bcm2835_close() что должен быть вызван почти один раз!

person Delayer    schedule 15.01.2014