#include #include #include char *buf; char in[256] = ""; ssize_t ret_out; int fd = open ("/dev/ttyUSB0", O_RDWR | O_NOCTTY ); set_interface_attribs (fd, B2400, 0); // set speed to 2,400 bps, 8n1 (no parity) set_blocking (fd, 0 ); // set no blocking strcpy( in, "UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"); ret_out = write (fd, in, strlen(in)); // sent wakeup usleep ((1000 + 25) * 100); // sleep enough to transmit plus buf = read_data( fd); // Initialisiere MBus -> ACK mit 'E5' in[0] = 0x10; in[1] = 0x40; // Init MBus in[2] = 0x00; in[3] = 0x40; // Checksumme = in[1] + in [2] in[4] = 0x16; ret_out = write (fd, in, 5); // sent usleep ((1000 + 25) * 100); // sleep enough to transmit plus buf = read_data( fd); if (buf[5] == 0xE5) { // Get Data from MBus in[0] = 0x10; in[1] = 0x5B; // GetData in[2] = 0x00; in[3] = 0x5B; // Checksumme = in[1] + in [2] in[4] = 0x16; ret_out = write (fd, in, 5); usleep ((1000 + 25) * 100); // sleep enough to transmit plus buf = read_data( fd); // Zaehlerstand double waerme = ((double) toInt(&buf[26])) + (100.0 * (double) toInt(&buf[27])) + (1000.0 * (double) toInt(&buf[28])) + (10000.0 * (double) toInt(&buf[29])); //aktuelle Leistung double leistung = ((double) toInt(&buf[44])) + (100.0 * (double) toInt(&buf[45])) + (1000.0 * (double) toInt(&buf[46])) + (10000.0 * (double) toInt(&buf[47])); } int toInt( char *in ) { char out[2]; int iOut = 0; sprintf(out, "%02x", in[0]); iOut = atoi(out); return iOut; }