Printing 0

12/14/2016

 

Page 47

Add 

#define _GNU_SOURCE

to the start of all programs that make use of the time.h header

i.e.page 47, page 271 and page 282

Program listings web page has been updated

Page 49 

The program seems to have aquired some nonsense at the start! The correct version is:

#include <bcm2835.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    if (!bcm2835_init())
        return 1;
    bcm2835_gpio_fsel(RPI_BPLUS_GPIO_J8_07,
                            BCM2835_GPIO_FSEL_OUTP);
    bcm2835_gpio_fsel(RPI_BPLUS_GPIO_J8_11,
                            BCM2835_GPIO_FSEL_OUTP);
    volatile int i;
    for (;;) {
        bcm2835_gpio_write(RPI_BPLUS_GPIO_J8_07, LOW);
        bcm2835_gpio_write(RPI_BPLUS_GPIO_J8_11, HIGH);
        bcm2835_gpio_write(RPI_BPLUS_GPIO_J8_07, HIGH);
        bcm2835_gpio_write(RPI_BPLUS_GPIO_J8_11, LOW);
    }
    return (EXIT_SUCCESS);
}

Page 166

The printf and humidy calculation uses byte1 to byte5 before they have been defined. The order just needs to be changed:

Change

printf("Checksum %d %d \n\r", byte5,  
        (byte1 + byte2 + byte3 + byte4) & 0xFF);
float humidity = (float) (byte1 << 8 | byte2) / 10.0;
int byte1 = getByte(1, buf);
int byte2 = getByte(2, buf);
int byte3 = getByte(3, buf);
int byte4 = getByte(4, buf);
int byte5 = getByte(5, buf);
printf("Humidity= %f \n\r", humidity); 

 

To 


int byte1 = getByte(1, buf);
int byte2 = getByte(2, buf);
int byte3 = getByte(3, buf);
int byte4 = getByte(4, buf);
int byte5 = getByte(5, buf);
printf("Checksum %d %d \n\r", byte5,  
        (byte1 + byte2 + byte3 + byte4) & 0xFF);
float humidity = (float) (byte1 << 8 | byte2) / 10.0;
printf("Humidity= %f \n\r", humidity);

 Page 250

 The test:

If(maxbytes>=sizeof(buf)) return -1

is silly. It is an attempt to check that the buffer is big enough but sizeof will return the size of the pointer not the array.

The size of the array is implied in maxbytes so no test is needed -- delete the test and ensure that buf has at least maxbytes elements before calling the function.

Page 257

Missing include means you get warnings about undeclared functions. Add the final include as listed:

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>

#include <unistd.h>

Page 263

Missing include means you get warnings about undeclared functions. Add the final include as listed:

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>

 You also need to change the inital part of the program to read:

 hints.ai_family =  AF_INET;
 hints.ai_socktype = SOCK_STREAM;
 hints.ai_flags = AI_PASSIVE;
 getaddrinfo(NULL, "80", &hints, &server);
int sockfd = socket(server->ai_family, server->ai_socktype| SOCK_NONBLOCK, server->ai_protocol);

The change is to take SOCK_NONB from the call to getaddrinfo and move it to socket.