C Аргументы командной строки в существующем C Code

Я настраиваю страницу PHP для управления некоторыми основными датчиками с помощью Raspberry Pi. Я работал над своим собственным PHP-кодом, но прошли годы с тех пор, как я даже коснулся кодирования, и я в растерянности, когда дело доходит до C. Я скомпилировал приведенный ниже код, и он отлично работает, и я получаю данные из датчик. Я смогу перенести данные в PHP без проблем. То, что я хотел бы сделать, это передать аргумент скомпилированной программе на C, который будет указывать, какой PIN-код считывать с raspberry pi.

define DHT_PIN 29 (Число 29 - это то, что я хотел бы передать через аргументы командной строки.)

Код C:

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#define MAX_TIMINGS 85
#define DHT_PIN 29
int data[5] = { 0, 0, 0, 0, 0 };

void read_dht_data()
{
    uint8_t laststate    = HIGH;
    uint8_t counter        = 0;
    uint8_t j            = 0, i;

    data[0] = data[1] = data[2] = data[3] = data[4] = 0;

    /* pull pin down for 18 milliseconds */
    pinMode( DHT_PIN, OUTPUT );
    digitalWrite( DHT_PIN, LOW );
    delay( 18 );

    /* prepare to read the pin */
    pinMode( DHT_PIN, INPUT );

    /* detect change and read data */
    for ( i = 0; i < MAX_TIMINGS; i++ )
    {
        counter = 0;
        while ( digitalRead( DHT_PIN ) == laststate )
        {
            counter++;
            delayMicroseconds( 1 );
            if ( counter == 255 )
            {
                break;
            }
        }
        laststate = digitalRead( DHT_PIN );

        if ( counter == 255 )
            break;

        /* ignore first 3 transitions */
        if ( (i >= 4) && (i % 2 == 0) )
        {
            /* shove each bit into the storage bytes */
            data[j / 8] <<= 1;
            if ( counter > 16 )
                data[j / 8] |= 1;
            j++;
        }
    }

    /*
     * check we read 40 bits (8bit x 5 ) + verify checksum in the last byte
     * print it out if data is good
     */

    if ( (j >= 40) &&
         (data[4] == ( (data[0] + data[1] + data[2] + data[3]) & 0xFF) ) )
    {
        float h = (float)((data[0] << 8) + data[1]) / 10;
        if ( h > 100 )
        {
            h = data[0];    // for DHT11
        }
        float c = (float)(((data[2] & 0x7F) << 8) + data[3]) / 10;
        if ( c > 125 )
        {
            c = data[2];    // for DHT11
        }
        if ( data[2] & 0x80 )
        {
            c = -c;
        }
        printf( "%.1f %% %.1f *C\n", h, c );
    }
    else  {
       printf( "Data not good, skip\n" );
    }
}

int main( void )
{
    printf( "DHT22 temperature/humidity test\n" );

    if ( wiringPiSetup() == -1 )
        exit( 1 );

    read_dht_data();
}

Я пытался читать, но C не мой язык. Я прошу некоторую помощь для выполнения моей задачи.

2 ответа

Решение

Вы должны изменить свой прототип для вашего main функция, а затем проанализировать аргументы:

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#define MAX_TIMINGS 85
int data[5] = { 0, 0, 0, 0, 0 };

void read_dht_data(long dhtPin)
{
    uint8_t laststate    = HIGH;
    uint8_t counter        = 0;
    uint8_t j            = 0, i;

    data[0] = data[1] = data[2] = data[3] = data[4] = 0;

    /* pull pin down for 18 milliseconds */
    pinMode( dhtPin, OUTPUT );
    digitalWrite( dhtPin, LOW );
    delay( 18 );

    /* prepare to read the pin */
    pinMode( dhtPin, INPUT );

    /* detect change and read data */
    for ( i = 0; i < MAX_TIMINGS; i++ )
    {
        counter = 0;
        while ( digitalRead( dhtPin ) == laststate )
        {
            counter++;
            delayMicroseconds( 1 );
            if ( counter == 255 )
            {
                break;
            }
        }
        laststate = digitalRead( dhtPin );

        if ( counter == 255 )
            break;

        /* ignore first 3 transitions */
        if ( (i >= 4) && (i % 2 == 0) )
        {
            /* shove each bit into the storage bytes */
            data[j / 8] <<= 1;
            if ( counter > 16 )
                data[j / 8] |= 1;
            j++;
        }
    }
}

int main(int argc, char * argv[])
{
  if (argc != 2)
  {
    printf("You must specify the DHT pin\n");
    return 1;
  }

  char *end;
  long dhtPin = strtol(argv[1], &end, 10);
  if (end == argv[1])
  {
    printf("Invalid number\n");
    return 1;
  }

  if ( wiringPiSetup() == -1 )
    return 1;

  read_dht_data(dhtPin);
  return 0;
}

Если вам нужен более сложный анализ аргументов, посмотрите getopt функция.

Используйте argv[] примерно так (при условии, что аргумент является целым числом):

int dht_pin = atoi(argv[1])

Вам нужно определить main как:

int main(int argc, char *argv[])
{ ... }

atoi () является частью stdlib.h

Другие вопросы по тегам