Sungo SXL MQTT Anbindung
Allgemeines
Nach einer kleinen Pause (5 Monate) versuche ich die SunGO SXL Anbindung aus dem Versuchstadium zu befreien und mal alles ordentlich zu machen. Die Hardware kommt in eine Gehäuse und die Software soll ihren ersten Stresztest bestehen.
Ausgangssituation
Abgesehen von der SunGo SXL Steuerung sind aktuelle noch ein RasPi 3B, ein CP2102 USBSER und Arduino NANO und 4 DS18B20 im Einsatz. Das Netzteil ist nur eine Übergangslösung. Am liebsten wuerde ich eine MiniUSV mit ins Gehaeuse packen. Mal schauen was es da von der Stange gibt. Auf dem RasPi laeuft derzeit nur eine Software die die Aufgabe hat die Daten des SunGo-Interfaces und die Temperaturen der 4 DS18B20 (Vor-/Ruecklauf-Heizkreis1 und Vor-/Ruecklauf-Fuszbodenheizung) einzulesen und per MQTT an den FHEM-Broker (MQTT-Server) zu liefern.
Software
Verdammt! Nach 5 Monaten raecht sich die fehlende Dokumentation.
Sungo_MQTT
Dieses Programm liest die Daten des Interfaces ueber die USB-Schnittstelle ein und uebergibt sie an die Console und den MQTT-Server.
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <stdbool.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h> // termios is the API that is in general recommended for serial I/O in Unix.
#include "MQTTClient.h"
// MQTT defines
#define ADDRESS "tcp://192.168.178.12:1883"
//#define ADDRESS "tcp://localhost:1883"
#define CLIENTID "SunGo"
//#define TOPIC "MQTTExamples"
//#define PAYLOAD "Hello World!"
#define QOS 0
#define TIMEOUT 10000L
// SERCOM defines
#define BAUDRATE B115200
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1
// SunGo defines
#define DUMMY 0
#define TEMPERATUR 1 // °C
#define STRAHLUNG 2 // W/m²
#define SPEICHER1 7 // kwh
#define DATUM 8
#define UHRZEIT 9
#define PROZENT 10 // %
#define FUNKTION1 11
#define FUNKTION2 12
#define SPEICHER2 15 // h
#define VOLUMENSTROM 19 // l/min
volatile int STOP=FALSE; // braucht man eigentlich nicht Man koennte z.B. um die Endlosschleife elegant zu verlassen durch einen Taster mit ISR die globale Variabe STOP auf true setzen
// solange das nicht realisiert ist laeuft die "main-Schleife" endlos.
// globale Variablen
char datum[11];
char uhrzeit[7];
char temperatur[25];
char prozent[7];
char strahlung[8];
char fehler[17];
char stunden[8];
char dummy[7];
// hexadezimale Darstellung in dezimale umstellen
unsigned int hextodec(char hex[10]){
unsigned int decimal=0;
unsigned int length=0;
unsigned int base = 1;
int i=0;
while(hex[i]!='\0'){
i++;
}
length=i;
//printf("hextodec %s\n\r",hex);
//printf("length %d\n\r",length);
for(i = length-1; i >= 0; i--){
//printf("i: %d\n\r",i);
if (i<0)i=0;
if(hex[i] >= '0' && hex[i] <= '9'){
decimal += ((unsigned char)hex[i] - 48) * base;
base *= 16;
}
else if(hex[i] >= 'A' && hex[i] <= 'F'){
decimal += ((unsigned char)hex[i] - 55) * base;
base *= 16;
}
else if(hex[i] >= 'a' && hex[i] <= 'f'){
decimal += ((unsigned char)hex[i] - 87) * base;
base *= 16;
}
}
//printf("decimal %d\n\r",decimal);
return decimal;
}
void delay(int number_of_seconds) // wird doch nicht gebraucht
{
// Converting time into milli_seconds
int milli_seconds = 1000 * number_of_seconds;
// Storing start time
clock_t start_time = clock();
// looping till required time is not achieved
while (clock() < start_time + milli_seconds)
;
}
// allgemeine Funktion; die verschiedenen Typen werden ueber switch case angesprochen
void formatieren(unsigned char typ,unsigned char lowbyte,unsigned char highbyte){
char data[10]=""; // dient der Aufnahme des zu wandelnden Wertes gebildet aus highbyte und lowbyte
char tmp[3]=""; // hilfvariable
char formatted[25]="";
char dataStr[5]="";
unsigned int dataInteger;
float dataFloat;
unsigned int dataStunden, dataMinuten;
//memset(formatted,'\0',sizeof(formatted));
//memset(data,'\0',sizeof(data));
//memset(tmp,'\0',sizeof(tmp));
// aus den beiden Einzelwerten wird der "Gesamtwert in der "richtigen" Reihenfolge gebildet
sprintf(tmp,"%02X",highbyte);
strcpy(data,tmp);
sprintf(tmp,"%02X",lowbyte);
strcat(data,tmp);
//printf("Data: %s\n",data);
dataInteger=hextodec(data);
switch(typ) {
case DUMMY: if(TRUE){
strcpy(dummy,data);
}
else{
strcpy(dummy,"Error!");
}
break;
case DATUM: sprintf(dataStr,"%d",dataInteger);
strcpy(formatted,"00.00.2021");
if(strlen(dataStr)==3){
formatted[0]=dataStr[1];
formatted[1]=dataStr[2];
formatted[4]=dataStr[0];
strcpy(datum,formatted);
}
else if(strlen(dataStr)==4){
formatted[0]=dataStr[2];
formatted[1]=dataStr[3];
formatted[3]=dataStr[0];
formatted[4]=dataStr[1];
strcpy(datum,formatted);
}
else{
strcpy(datum,"Error!");
}
break;
case UHRZEIT: dataStunden=(unsigned int)dataInteger/60;
dataMinuten=dataInteger-(dataStunden*60);
if(TRUE){ // hier koennte man die gueltig der stunden und minuten noch testen
sprintf(formatted,"%02d:%02d",dataStunden,dataMinuten);
strcpy(uhrzeit,formatted);
}
else{
strcpy(uhrzeit,"Error!");
}
break;
case TEMPERATUR: dataFloat=(float)dataInteger/10.0;
if(TRUE){
//sprintf(formatted,"%5.1f °C (%d) ",dataFloat,dataInteger);
sprintf(formatted,"%5.1f °C",dataFloat);
strcpy(temperatur,formatted);
}
else{
strcpy(temperatur,"Error!\0");
}
break;
case SPEICHER2: if(TRUE){
sprintf(formatted,"%dh",dataInteger);
strcpy(stunden,formatted);
}
else{
strcpy(stunden,"Error!");
}
break;
case PROZENT: if(TRUE){
sprintf(formatted,"%3d%%",dataInteger);
strcpy(prozent,formatted);
}
else{
strcpy(prozent,"Error!");
}
break;
case STRAHLUNG: if(TRUE){
sprintf(formatted,"%d W/m² ",dataInteger);
strcpy(strahlung,formatted);
}
else{
strcpy(strahlung,"Error!\0");
}
break;
default: printf("Type Error (unknown)\n"); break;
}
return;
}
int main(int argc, char **argv)
{ int i; // Schleifenzaehler allgemein
unsigned int state=0, syncstate=0; // state 10,20,30 oder 31 entsprechend 0100, 0200, 0300, 0301
unsigned int dsIndex, dfIndex; // Zeiger auf Datensatz und Datenfeld
unsigned long zeitzaehler=0; // Ausgabe verlangsamen 500000 etwa 1 Minute
unsigned char buf[1];
unsigned char merker[6];
unsigned char datensatz[100];
unsigned char datenfeld[100];
unsigned char datenfelder[50][16];
bool printflag;
// MQTT Vorbereitung
MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token;
int mqttrc; //
char topic[255]; // zur Aufnahme Werte unterhalb des basetopic
char *basetopic = "Haus/Heizung/Solaranlage/SunGo/";
// MQTT Cleint Struktur anlegen
if ((mqttrc = MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTCLIENT_SUCCESS){
printf("Failed to create mqttclient, return code %d\n", mqttrc);
exit(EXIT_FAILURE);
}
// SerCOM Vorbereitung
struct termios oldtio,newtio;
int fd; // FileDescriptor SerCOM
int res; // SerCOM Einlesekontrolle
// wenn in Kommandozeile die Schnittstelle mitgegeben wird, dann nimm diese sonst versuche default
if (argc > 1)
fd = open(argv[1], O_RDWR | O_NOCTTY );
else
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
if (fd <0) {
perror(MODEMDEVICE);
exit(-1);
}
// sichere die aktuellen Einstellungen
tcgetattr(fd,&oldtio);
// baue die neuen Einstellungen zusammen
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | IXON | IXOFF;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
newtio.c_cc[VMIN] = 1; /* blocking read until 1 chars received */
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
setvbuf(stdout, (char *)NULL, _IONBF, 0);
// hier sind alle Vorbereitungen (SERCOM, MQTT) abgeschlossen jetzt koennen die Daten des Interfaces eingelesen, aufbereitet und per MQTT gesendet werden
// Die 4 verschiedenen denkbaren Pakete (DPA_1, DPA_2, DPB_1, DPB_2) beginnen alle mit AA 55 55 AA (DEZ: 170 85 85 170)
// wenn diese Folge erkannt wird bestimmen die beiden folgenden Bytes den Typ des Paketes
while (STOP==FALSE) { // Endlosschleife
res = read(fd,buf,1);
//sobald ein AA kommt beginne die Beobachtung
if ((buf[0]==170) && (syncstate==5)){
syncstate=0;
}
if ((buf[0]==170) && (syncstate==0)){ // wenn der syncstate 0 (gleich Anfang) und ein AA erkannt wird dann setze sysncstate=1
syncstate=1;
merker[0]=buf[0];
}
if ((buf[0]==85) && (syncstate==1)){ // wenn der syncstate 1 (AA bereits erkannt) und ein 55 erkannt wird dann setze sysncstate=2
syncstate=2;
merker[1]=buf[0];
}
if ((buf[0]==85) && (syncstate==2)){ // wenn der syncstate 2 (AA 55 bereits erkannt) und ein 55 erkannt wird dann setze sysncstate=3
syncstate=3;
merker[2]=buf[0];
}
if ((buf[0]==170) && (syncstate==3)){ // wenn der syncstate 3 (AA 55 55 bereits erkannt) und ein AA erkannt wird dann setze sysncstate=4
syncstate=4;
merker[3]=buf[0];
state=0;
}
// wenn AA 55 55 AA erkannt wurde steht syncstate auf 4 , in merker[0-3] befindet sich die Syncfolge und state ist 0
// wenn das nachfolgende Byte entweder 01 02 oder 03 ist ist alles wie erwartet und kann weitergehen syncstate = 5
if (((buf[0]==1)||(buf[0]==2)||(buf[0]==3)) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==4)){
merker[4]=buf[0];
syncstate=5;
}
// ab hier werden die 4 Pakete unterschieden DPA_1 0200 (state 20), DPA_2 0100 (state 10), DPB_1 0301 (state 31) und DPB_2 0300 (state 30)
if ((buf[0]==0) && (merker[4]==1) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){
state=10; // state 10 bereit fuer 0100 Daten fuer das LC-Display
printflag=FALSE;
for(i=0;i<5;i++)merker[i]=0;
}
if ((buf[0]==0) && (merker[4]==2) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){
state=20; // state 20 bereit fuer 0200 hat keinen (?) Inhalt -> keine Auswertung
printflag=FALSE;
for(i=0;i<5;i++)merker[i]=0;
}
if ((buf[0]==0) && (merker[4]==3) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){
state=30; // state 30 bereit fuer 0300 Datensatze
printflag=FALSE;
for(i=0;i<5;i++)merker[i]=0;
dsIndex=0;
}
if ((buf[0]==1) && (merker[4]==3) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){
state=31; // state 31 bereit fuer 0301 Datenfaelder
printflag=FALSE;
for(i=0;i<5;i++)merker[i]=0;
dfIndex=0;
}
// state 10 und 20 werden nicht ausgewertet
if ((state==10) && printflag) {
}
else if ((state==20) && printflag) {
}
else if ((state==30) && printflag){
if(dsIndex<100)datensatz[dsIndex++]=buf[0];
}
else if ((state==31) && printflag) {
if(dfIndex<100)datenfeld[dfIndex++]=buf[0];
}
else{
//printf("syncstate: %d, state: %d, %X\n\r",syncstate,state,buf[0]);
}
printflag=TRUE;
if (zeitzaehler==10000){
// es wird etwa 3 mal pro Minute eine Auswahl der Datensaetze ausgegeben
// Datum: 18.09.2021
// Message published, return code 0
// Uhrzeit: 12:17
// Message published, return code 0
// Kollektor: 58.6 °C
// Message published, return code 0
// Speicher unten: 49.2 °C
// Message published, return code 0
// Speicher oben: 52.1 °C
// Message published, return code 0
// Rücklaufanhebung T7: 52.0 °C
// Message published, return code 0
// Rücklaufanhebung T8: 28.1 °C
// Message published, return code 0
// Ausgang 1: 60%
// Message published, return code 0
// Ausgang 6: 100%
// Message published, return code 0
// Speicher 2: 15632h
// Message published, return code 0
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
// Baue MQTT Verbindung auf
if ((mqttrc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS){
printf("Failed to connect, return code %d\n", mqttrc);
exit(EXIT_FAILURE);
}
//Datum
formatieren(DATUM,datensatz[2],datensatz[3]);
printf("Datum: %s\n",datum);
strcpy(topic,basetopic);
strcat(topic,"Datum");
pubmsg.payload = datum;
pubmsg.payloadlen = (int)strlen(datum);
pubmsg.qos = QOS;
pubmsg.retained = 0;
if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
printf("Failed to publish message, return code %d\n", mqttrc);
exit(EXIT_FAILURE);
}else{
printf("Message published, return code %d\n", mqttrc);
}
//Uhrzeit
formatieren(UHRZEIT,datensatz[4],datensatz[5]);
printf("Uhrzeit: %s\n",uhrzeit);
strcpy(topic,basetopic);
strcat(topic,"Uhrzeit");
pubmsg.payload = uhrzeit;
pubmsg.payloadlen = (int)strlen(uhrzeit);
pubmsg.qos = QOS;
pubmsg.retained = 0;
if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
printf("Failed to publish message, return code %d\n", mqttrc);
exit(EXIT_FAILURE);
}else{
printf("Message published, return code %d\n", mqttrc);
}
//Kollektor
formatieren(TEMPERATUR,datensatz[6],datensatz[7]);
printf("Kollektor: %s\n",temperatur);
strcpy(topic,basetopic);
strcat(topic,"Kollektor/Temperatur");
pubmsg.payload = temperatur;
pubmsg.payloadlen = (int)strlen(temperatur);
pubmsg.qos = QOS;
pubmsg.retained = 0;
if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
printf("Failed to publish message, return code %d\n", mqttrc);
exit(EXIT_FAILURE);
}else{
printf("Message published, return code %d\n", mqttrc);
}
//Speicher unten
formatieren(TEMPERATUR,datensatz[8],datensatz[9]);
printf("Speicher unten: %s\n",temperatur);
strcpy(topic,basetopic);
strcat(topic,"Speicher/unten/Temperatur");
pubmsg.payload = temperatur;
pubmsg.payloadlen = (int)strlen(temperatur);
pubmsg.qos = QOS;
pubmsg.retained = 0;
if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
printf("Failed to publish message, return code %d\n", mqttrc);
exit(EXIT_FAILURE);
}else{
printf("Message published, return code %d\n", mqttrc);
}
//Speicher oben
formatieren(TEMPERATUR,datensatz[10],datensatz[11]);
printf("Speicher oben: %s\n",temperatur);
strcpy(topic,basetopic);
strcat(topic,"Speicher/oben/Temperatur");
pubmsg.payload = temperatur;
pubmsg.payloadlen = (int)strlen(temperatur);
pubmsg.qos = QOS;
pubmsg.retained = 0;
if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
printf("Failed to publish message, return code %d\n", mqttrc);
exit(EXIT_FAILURE);
}else{
printf("Message published, return code %d\n", mqttrc);
}
//Rücklaufanhebung T7
formatieren(TEMPERATUR,datensatz[18],datensatz[19]);
printf("Rücklaufanhebung T7: %s\n",temperatur);
strcpy(topic,basetopic);
strcat(topic,"Rücklaufanhebung/T7/Temperatur");
pubmsg.payload = temperatur;
pubmsg.payloadlen = (int)strlen(temperatur);
pubmsg.qos = QOS;
pubmsg.retained = 0;
if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
printf("Failed to publish message, return code %d\n", mqttrc);
exit(EXIT_FAILURE);
}else{
printf("Message published, return code %d\n", mqttrc);
}
//Rücklaufanhebung T8
formatieren(TEMPERATUR,datensatz[20],datensatz[21]);
printf("Rücklaufanhebung T8: %s\n",temperatur);
strcpy(topic,basetopic);
strcat(topic,"Rücklaufanhebung/T8/Temperatur");
pubmsg.payload = temperatur;
pubmsg.payloadlen = (int)strlen(temperatur);
pubmsg.qos = QOS;
pubmsg.retained = 0;
if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
printf("Failed to publish message, return code %d\n", mqttrc);
exit(EXIT_FAILURE);
}else{
printf("Message published, return code %d\n", mqttrc);
}
//Ausgang 1
formatieren(PROZENT,datensatz[32],0);
printf("Ausgang 1: %s\n",prozent);
strcpy(topic,basetopic);
strcat(topic,"Ausgang/1/Prozent");
pubmsg.payload = prozent;
pubmsg.payloadlen = (int)strlen(prozent);
pubmsg.qos = QOS;
pubmsg.retained = 0;
if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
printf("Failed to publish message, return code %d\n", mqttrc);
exit(EXIT_FAILURE);
}else{
printf("Message published, return code %d\n", mqttrc);
}
//Ausgang 6
formatieren(PROZENT,datensatz[37],0);
printf("Ausgang 6: %s\n",prozent);
strcpy(topic,basetopic);
strcat(topic,"Ausgang/6/Prozent");
pubmsg.payload = prozent;
pubmsg.payloadlen = (int)strlen(prozent);
pubmsg.qos = QOS;
pubmsg.retained = 0;
if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
printf("Failed to publish message, return code %d\n", mqttrc);
exit(EXIT_FAILURE);
}else{
printf("Message published, return code %d\n", mqttrc);
}
// Speicherstunden
formatieren(SPEICHER2,datensatz[50],datensatz[51]);
printf("Speicher 2: %s\n",stunden);
strcpy(topic,basetopic);
strcat(topic,"Speicher/Stunden");
pubmsg.payload = stunden;
pubmsg.payloadlen = (int)strlen(stunden);
pubmsg.qos = QOS;
pubmsg.retained = 0;
if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
printf("Failed to publish message, return code %d\n", mqttrc);
exit(EXIT_FAILURE);
}else{
printf("Message published, return code %d\n", mqttrc);
}
/* printf("Waiting for up to %d seconds for publication of %s\n"
"on topic %s for client with ClientID: %s\n",
(int)(TIMEOUT/1000), PAYLOAD, TOPIC, CLIENTID);
rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
printf("Message with delivery token %d delivered\n", token);
*/
if ((mqttrc = MQTTClient_disconnect(client, 10000)) != MQTTCLIENT_SUCCESS){
printf("Failed to disconnect, return code %d\n", mqttrc);
}
zeitzaehler=0;
}
zeitzaehler++;
if (zeitzaehler%100000==0)printf("%d\n",zeitzaehler); // Lebenszeichen
}
close(fd); // schliesze serielle Schnittstelle
tcsetattr(fd,TCSANOW,&oldtio); // stelle die alte ComConfig wieder her
MQTTClient_destroy(&client); // beende die MQTT Kommunikation
return EXIT_SUCCESS;
}
Sungoauswertungcurses
Dieses Programm dient erst mal nur dem Einlesen und Interpretieren der Daten vom Interface. Sie werden nach der Aufbereitung geordnet und auf der Console mittels curses ausgegeben. In diesem Programm sind noch die alten Varianten der Konvertierungsfunktionen vorhanden. Dies ist zwar nicht elegant, aber es funktioniert.
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h> // termios is the API that is in general recommended for serial I/O in Unix.
#include <curses.h>
#define BAUDRATE B115200
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
char datum[11];
char uhrzeit[7];
char temperatur[25];
char prozent[7];
char fehler[17];
char stunden[8];
char dummy[7];
unsigned int hextodec(char hex[10]){
unsigned int decimal=0;
unsigned int length=0;
unsigned int base = 1;
int i=0;
while(hex[i]!='\0'){
i++;
}
length=i;
//printf("hextodec %s\n\r",hex);
//printf("length %d\n\r",length);
for(i = length-1; i >= 0; i--){
//printf("i: %d\n\r",i);
if (i<0)i=0;
if(hex[i] >= '0' && hex[i] <= '9'){
decimal += ((unsigned char)hex[i] - 48) * base;
base *= 16;
}
else if(hex[i] >= 'A' && hex[i] <= 'F'){
decimal += ((unsigned char)hex[i] - 55) * base;
base *= 16;
}
else if(hex[i] >= 'a' && hex[i] <= 'f'){
decimal += ((unsigned char)hex[i] - 87) * base;
base *= 16;
}
}
//printf("decimal %d\n\r",decimal);
return decimal;
}
void datumformatieren(unsigned char lowbyte,unsigned char highbyte){
char data[10]="";
char tmp[3]="";
char datumStr_formatted[]="00.00.2021";
char datumStr[5]="";
unsigned int datumInt;
size_t l;
sprintf(tmp,"%X",highbyte);
strcpy(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
sprintf(tmp,"%X",lowbyte);
strcat(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
//strcpy(data,"0135");
//printf("data: %s\n\r",data);
datumInt=hextodec(data);
//printf("int: %d\n\r",datumInt);
sprintf(datumStr,"%d",datumInt);
if(strlen(datumStr)==3){
datumStr_formatted[0]=datumStr[1];
datumStr_formatted[1]=datumStr[2];
datumStr_formatted[4]=datumStr[0];
strcpy(datum,datumStr_formatted);
}
else if(strlen(datumStr)==4){
datumStr_formatted[0]=datumStr[2];
datumStr_formatted[1]=datumStr[3];
datumStr_formatted[3]=datumStr[0];
datumStr_formatted[4]=datumStr[1];
strcpy(datum,datumStr_formatted);
}
else{
strcpy(datum,"Error!");
}
return;
}
void uhrzeitformatieren(unsigned char lowbyte,unsigned char highbyte){
char data[10]="";
char tmp[3]="";
char uhrzeitStr_formatted[]="00:00";
unsigned int uhrzeitInt, stunden, minuten;
size_t l;
sprintf(tmp,"%02X",highbyte);
strcpy(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
sprintf(tmp,"%02X",lowbyte);
strcat(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
//strcpy(data,"1500");
//printf("data: %s\n\r",data);
uhrzeitInt=hextodec(data);
//printf("int: %d\n\r",uhrzeitInt);
stunden=(unsigned int)uhrzeitInt/60;
minuten=uhrzeitInt-(stunden*60);
if(TRUE){ // hier koennte man die gueltig der stunden und minuten noch testen
sprintf(uhrzeitStr_formatted,"%02d:%02d",stunden,minuten);
strcpy(uhrzeit,uhrzeitStr_formatted);
}
else{
strcpy(uhrzeit,"Error!");
}
return;
}
void temperaturformatieren(unsigned char lowbyte,unsigned char highbyte){
char data[10]="";
char tmp[3]="";
char temperaturStr_formatted[20]="";
unsigned int temperaturInt;
float temperaturFloat;
size_t l;
memset(data,'\0',sizeof(data));
memset(tmp,'\0',sizeof(tmp));
sprintf(tmp,"%02X",highbyte);
strcpy(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
sprintf(tmp,"%02X",lowbyte);
strcat(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
//strcpy(data,"0500");
//printf("data: %s\n\r",data);
temperaturInt=hextodec(data);
//printf("int: %d\n\r",temperaturInt);
temperaturFloat=(float)temperaturInt/10.0;
if(TRUE){
memset(temperaturStr_formatted,'\0',sizeof(temperaturStr_formatted));
sprintf(temperaturStr_formatted,"%5.1f °C (%d) ",temperaturFloat,temperaturInt);
strcpy(temperatur,temperaturStr_formatted);
}
else{
strcpy(temperatur,"Error!\0");
}
return;
}
void prozentformatieren(unsigned char byte){
char data[10]="";
char tmp[3]="";
char prozentStr_formatted[]="000%";
unsigned int prozentInt;
size_t l;
sprintf(tmp,"%X",byte);
strcpy(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
//strcpy(data,"1500");
//printf("data: %s\n\r",data);
prozentInt=hextodec(data);
//printf("int: %d\n\r",prozentInt);
if(TRUE){
sprintf(prozentStr_formatted,"%3d%%",prozentInt);
strcpy(prozent,prozentStr_formatted);
}
else{
strcpy(prozent,"Error!");
}
return;
}
void stundenformatieren(unsigned char lowbyte,unsigned char highbyte){
char data[10]="";
char tmp[3]="";
char stundenStr_formatted[]="000000h";
unsigned int stundenInt;
sprintf(tmp,"%X",highbyte);
strcpy(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
sprintf(tmp,"%X",lowbyte);
strcat(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
//strcpy(data,"1500");
//printf("data: %s\n\r",data);
stundenInt=hextodec(data);
//printf("int: %d\n\r",temperaturInt);
if(TRUE){
sprintf(stundenStr_formatted,"%dh",stundenInt);
strcpy(stunden,stundenStr_formatted);
}
else{
strcpy(stunden,"Error!");
}
return;
}
void fehlerformatieren(unsigned char byte1,unsigned char byte2,unsigned char byte3,unsigned char byte4,unsigned char byte5,unsigned char byte6,unsigned char byte7,unsigned char byte8){
char data[10]="";
char tmp[3]="";
char fehlerStr_formatted[9];
unsigned int fehlerInt;
fehlerInt=12345;
if(TRUE){
sprintf(fehlerStr_formatted,"%d",fehlerInt);
strcpy(fehler,fehlerStr_formatted);
}
else{
strcpy(fehler,"Error!");
}
return;
}
void dummyformatieren(unsigned char lowbyte,unsigned char highbyte){
char data[10]="";
char tmp[3]="";
sprintf(tmp,"%X",highbyte);
strcpy(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
sprintf(tmp,"%X",lowbyte);
strcat(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
if(TRUE){
strcpy(dummy,data);
}
else{
strcpy(dummy,"Error!");
}
return;
}
int main(int argc, char **argv)
{
struct termios oldtio,newtio;
int fd;
int c;
int res;
int i,k,l;
unsigned int x,y,z,t1,t2,t3,dsIndex, dfIndex, dfX, dfY, sort1,sort2, stelle, zeilenproblock;
unsigned int state=0, syncstate=0;
unsigned char buf[1];
unsigned char merker[6];
unsigned char datensatz[200];
unsigned char datenfeld[100];
unsigned char datenfelder[50][16];
char data[10]="";
char tmp[3]="";
bool printflag;
memset(temperatur, '\0', sizeof(temperatur));
// wenn in Kommandozeile die Schnittstelle mitgegeben wird, dann nim diese sonst veruche default
if (argc > 1)
fd = open(argv[1], O_RDWR | O_NOCTTY );
else
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
if (fd <0) {
perror(MODEMDEVICE);
exit(-1);
}
// sichere die aktuellen Einstellungen
tcgetattr(fd,&oldtio);
// baue die neuen Einstellungen zusammen
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | IXON | IXOFF;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
newtio.c_cc[VMIN] = 5; /* blocking read until 5 chars received */
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
setvbuf(stdout, (char *)NULL, _IONBF, 0);
initscr();
getmaxyx(stdscr,x,y);
printf("X:%d/Y:%d\n",x,y);
while (STOP==FALSE) { /* loop for input */
res = read(fd,buf,1); /* returns after 5 chars have been input */
//printf("A: syncstate: %d, state: %d, %X\n\r",syncstate,state,buf[0]);
//sobald ein AA kommt beginne die Beobachtung
if ((buf[0]==170) && (syncstate==5)){
syncstate=0;
}
if ((buf[0]==170) && (syncstate==0)){
syncstate=1;
merker[0]=buf[0];
}
if ((buf[0]==85) && (syncstate==1)){
syncstate=2;
merker[1]=buf[0];
}
if ((buf[0]==85) && (syncstate==2)){
syncstate=3;
merker[2]=buf[0];
}
if ((buf[0]==170) && (syncstate==3)){
syncstate=4;
merker[3]=buf[0];
state=0;
}
if (((buf[0]==1)||(buf[0]==2)||(buf[0]==3)) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==4)){
merker[4]=buf[0];
syncstate=5;
}
if ((buf[0]==0) && (merker[4]==1) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){
state=10; // state 10 bereit fuer 0100
printflag=FALSE;
for(i=0;i<5;i++)merker[i]=0;
x=1;
y=8;
stelle=0;
}
if ((buf[0]==0) && (merker[4]==2) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){
state=20; // state 10 bereit fuer 0100
printflag=FALSE;
for(i=0;i<5;i++)merker[i]=0;
x=2;
y=8;
stelle=0;
}
if ((buf[0]==0) && (merker[4]==3) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){
state=30; // state 10 bereit fuer 0100
printflag=FALSE;
for(i=0;i<5;i++)merker[i]=0;
dsIndex=0;
x=3;
y=8;
stelle=0;
}
if ((buf[0]==1) && (merker[4]==3) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){
state=31; // state 10 bereit fuer 0100
printflag=FALSE;
for(i=0;i<5;i++)merker[i]=0;
dfIndex=0;
x=4;
y=8;
stelle=0;
}
zeilenproblock=3;
if ((state==10) && printflag) {
z=(x-1)*zeilenproblock+x;
mvprintw(z,1,"0100:");
mvaddch(z,y,buf[0]);
mvprintw(z+1,y,"%02X ",buf[0]);
mvprintw(z+2,y,"%d ",stelle);
y+=3;
stelle++;
}
else if ((state==20) && printflag) {
z=(x-1)*zeilenproblock+x;
mvprintw(z,1,"0200:");
mvaddch(z,y,buf[0]);
mvprintw(z+1,y,"%02X ",buf[0]);
mvprintw(z+2,y,"%d ",stelle);
y+=3;
stelle++;
}
else if ((state==30) && printflag){
z=(x-1)*zeilenproblock+x;
mvprintw(z,1,"0300:");
mvaddch(z,y,buf[0]);
mvprintw(z+1,y,"%02X ",buf[0]);
mvprintw(z+2,y,"%d ",stelle);
y+=3;
stelle++;
if(dsIndex<100)datensatz[dsIndex++]=buf[0];
}
else if ((state==31) && printflag) {
z=(x-1)*zeilenproblock+x;
mvprintw(z,1,"0301:");
mvaddch(z,y,buf[0]);
mvprintw(z+1,y,"%02X ",buf[0]);
mvprintw(z+2,y,"%d ",stelle);
y+=3;
stelle++;
if(dfIndex<100)datenfeld[dfIndex++]=buf[0];
}
else{
//printf("syncstate: %d, state: %d, %X\n\r",syncstate,state,buf[0]);
}
//mvprintw(5,1,"Test");
printflag=TRUE;
refresh();
//printf("E: syncstate: %d, state: %d, %X\n\r",syncstate,state,buf[0]);
//if (buf[0]=='z') STOP=TRUE;
//x max = 4
z=20;
t1=35;
t2=t1+30;
sort1=0;
mvprintw(z+sort1,1,"Datum: (2,3)");
datumformatieren(datensatz[2],datensatz[3]);
//printf("datum: %s",datum);
mvprintw(z+sort1,t1,datum);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[2],datensatz[3]);
sort1++;
mvprintw(z+sort1,1,"Uhrzeit: (4,5)");
uhrzeitformatieren(datensatz[4],datensatz[5]);
//printf("uhrzeit: %s",uhrzeit);
mvprintw(z+sort1,t1,uhrzeit);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[4],datensatz[5]);
sort1++;
mvprintw(z+sort1,1,"Kollektor: (6,7)");
temperaturformatieren(datensatz[6],datensatz[7]);
//printf("temperatur: %s",temperatur);
mvprintw(z+sort1,t1,"%s",temperatur);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[6],datensatz[7]);
sort1++;
mvprintw(z+sort1,1,"Speicher unten: (8,9)");
temperaturformatieren(datensatz[8],datensatz[9]);
//printf("temperatur: %s",temperatur);
mvprintw(z+sort1,t1,"%s",temperatur);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[8],datensatz[9]);
sort1++;
mvprintw(z+sort1,1,"Speicher oben: (10,11)");
temperaturformatieren(datensatz[10],datensatz[11]);
//printf("temperatur: %s",temperatur);
mvprintw(z+sort1,t1,"%s",temperatur);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[10],datensatz[11]);
sort1++;
mvprintw(z+sort1,1,"Thermostat: (12,13)");
temperaturformatieren(datensatz[12],datensatz[13]);
//printf("temperatur: %s",temperatur);
mvprintw(z+sort1,t1,"%s",temperatur);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[12],datensatz[13]);
sort1++;
mvprintw(z+sort1,1,"Poolschutz: (14,15)");
temperaturformatieren(datensatz[14],datensatz[15]);
//printf("temperatur: %s",temperatur);
mvprintw(z+sort1,t1,"%s",temperatur);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[14],datensatz[15]);
sort1++;
mvprintw(z+sort1,1,"Ertrag: (16,17)");
temperaturformatieren(datensatz[16],datensatz[17]);
//printf("temperatur: %s",temperatur);
mvprintw(z+sort1,t1,"%s",temperatur);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[16],datensatz[17]);
sort1++;
mvprintw(z+sort1,1,"Ruecklaufanhebung T7: (18,19)");
temperaturformatieren(datensatz[18],datensatz[19]);
//printf("temperatur: %s",temperatur);
mvprintw(z+sort1,t1,"%s",temperatur);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[18],datensatz[19]);
sort1++;
mvprintw(z+sort1,1,"Ruecklaufanhebung T8: (20,21)");
temperaturformatieren(datensatz[20],datensatz[21]);
//printf("temperatur: %s",temperatur);
mvprintw(z+sort1,t1,"%s",temperatur);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[20],datensatz[21]);
sort1++;
mvprintw(z+sort1,1,"T: (22,23)");
temperaturformatieren(datensatz[22],datensatz[23]);
//printf("temperatur: %s",temperatur);
mvprintw(z+sort1,t1,"%s",temperatur);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[22],datensatz[23]);
sort1++;
mvprintw(z+sort1,1,"Dummy: (24,25)");
dummyformatieren(datensatz[24],datensatz[25]);
//printf("dummy: %s",dummy);
mvprintw(z+sort1,t1,dummy);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[24],datensatz[25]);
sort1++;
mvprintw(z+sort1,1,"Strahlung: (26,27)");
temperaturformatieren(datensatz[26],datensatz[27]);
//printf("temperatur: %s",temperatur);
mvprintw(z+sort1,t1,temperatur);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[26],datensatz[27]);
sort1++;
mvprintw(z+sort1,1,"Dummy: (28,29)");
dummyformatieren(datensatz[28],datensatz[29]);
//printf("dummy: %s",dummy);
mvprintw(z+sort1,t1,dummy);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[28],datensatz[29]);
sort1++;
mvprintw(z+sort1,1,"Dummy: (30,31)");
temperaturformatieren(datensatz[30],datensatz[31]);
//printf("dummy: %s",dummy);
mvprintw(z+sort1,t1,dummy);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[30],datensatz[31]);
sort1++;
mvprintw(z+sort1,1,"Ausgang 1: (32)");
prozentformatieren(datensatz[32]);
//printf("prozent: %s",prozent);
mvprintw(z+sort1,t1,prozent);
mvprintw(z+sort1,t2,"%02X",datensatz[32]);
sort1++;
mvprintw(z+sort1,1,"Ausgang 2: (33)");
prozentformatieren(datensatz[33]);
//printf("prozent: %s",prozent);
mvprintw(z+sort1,t1,prozent);
mvprintw(z+sort1,t2,"%02X",datensatz[33]);
sort1++;
mvprintw(z+sort1,1,"Ausgang 3: (34)");
prozentformatieren(datensatz[34]);
//printf("prozent: %s",prozent);
mvprintw(z+sort1,t1,prozent);
mvprintw(z+sort1,t2,"%02X",datensatz[34]);
sort1++;
mvprintw(z+sort1,1,"Ausgang 4: (35)");
prozentformatieren(datensatz[35]);
//printf("prozent: %s",prozent);
mvprintw(z+sort1,t1,prozent);
mvprintw(z+sort1,t2,"%02X",datensatz[35]);
sort1++;
mvprintw(z+sort1,1,"Ausgang 5: (36)");
prozentformatieren(datensatz[36]);
//printf("prozent: %s",prozent);
mvprintw(z+sort1,t1,prozent);
mvprintw(z+sort1,t2,"%02X",datensatz[36]);
sort1++;
mvprintw(z+sort1,1,"Ausgang 6: (37)");
prozentformatieren(datensatz[37]);
//printf("prozent: %s",prozent);
mvprintw(z+sort1,t1,prozent);
mvprintw(z+sort1,t2,"%02X",datensatz[37]);
sort1++;
mvprintw(z+sort1,1,"Fehler: (38-45)");
fehlerformatieren(datensatz[38],datensatz[39],datensatz[40],datensatz[41],datensatz[42],datensatz[43],datensatz[44],datensatz[45]);
//printf("fehler: %s",fehler);
mvprintw(z+sort1,t1,fehler);
mvprintw(z+sort1,t2,"%02X %02X %02X %02X %02X %02X %02X %02X",datensatz[38],datensatz[39],datensatz[40],datensatz[41],datensatz[42],datensatz[43],datensatz[44],datensatz[45]);
sort1++;
mvprintw(z+sort1,1,"Speicher 1: (46,47)");
temperaturformatieren(datensatz[46],datensatz[47]);
//printf("temperatur: %s",temperatur);
mvprintw(z+sort1,t1,temperatur);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[46],datensatz[47]);
sort1++;
mvprintw(z+sort1,1,"Dummy: (48,49)");
dummyformatieren(datensatz[48],datensatz[49]);
//printf("dummy: %s",dummy);
mvprintw(z+sort1,t1,dummy);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[48],datensatz[49]);
sort1++;
mvprintw(z+sort1,1,"Speicher 2: (50,51)");
stundenformatieren(datensatz[50],datensatz[51]);
//printf("stunden: %s",stunden);
mvprintw(z+sort1,t1,stunden);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[50],datensatz[51]);
sort1++;
mvprintw(z+sort1,1,"Dummy: (52,53)");
dummyformatieren(datensatz[52],datensatz[53]);
//printf("dummy: %s",dummy);
mvprintw(z+sort1,t1,dummy);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[52],datensatz[53]);
sort1++;
mvprintw(z+sort1,1,"Dummy: (54,55)");
dummyformatieren(datensatz[54],datensatz[55]);
//printf("dummy: %s",dummy);
mvprintw(z+sort1,t1,dummy);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[54],datensatz[55]);
sort1++;
mvprintw(z+sort1,1,"Funktion 1 aktiv: (56,57)");
dummyformatieren(datensatz[56],datensatz[57]);
//printf("dummy: %s",dummy);
mvprintw(z+sort1,t1,dummy);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[56],datensatz[57]);
sort1++;
mvprintw(z+sort1,1,"Funktion 2 aktiv: (58,59)");
dummyformatieren(datensatz[58],datensatz[59]);
//printf("dummy: %s",dummy);
mvprintw(z+sort1,t1,dummy);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[58],datensatz[59]);
sort1++;
mvprintw(z+sort1,1,"Volumenstrom: (60,61)");
dummyformatieren(datensatz[60],datensatz[61]);
//printf("dummy: %s",dummy);
mvprintw(z+sort1,t1,dummy);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[60],datensatz[61]);
sort1++;
mvprintw(z+sort1,1,"Dummy: (62,63)");
dummyformatieren(datensatz[62],datensatz[63]);
//printf("dummy: %s",dummy);
mvprintw(z+sort1,t1,dummy);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[62],datensatz[63]);
sort1++;
mvprintw(z+sort1,1,"Dummy: (64,65)");
dummyformatieren(datensatz[64],datensatz[65]);
//printf("dummy: %s",dummy);
mvprintw(z+sort1,t1,dummy);
mvprintw(z+sort1,t2,"%02X %02X",datensatz[64],datensatz[65]);
t3=t2+20;
sort2=0;
i=0;
mvprintw(z+sort2,t3,"%02X ",datenfeld[i++]);
mvprintw(z+sort2,t3+3,"%02X ",datenfeld[i++]);
mvprintw(z+sort2,t3+6,"%02X ",datenfeld[i++]);
for(k=0;k<32;k++){
sprintf(tmp,"%X",datenfeld[i+(k*16)]);
strcpy(data,tmp);
sort2=hextodec(data)*2;
if (sort2>62) sort2=64;
for(l=0;l<16;l++){
mvprintw(z+sort2,t3+(l*3),"%02X ",datenfeld[i+(k*16)+l]);
if (datenfeld[i+(k*16)+l]!=0){ mvprintw(z+sort2+1,t3+(l*3),"%c ",datenfeld[i+(k*16)+l]); }
else { mvprintw(z+sort2+1,t3+(l*3)," "); }
}
}
}
endwin();
close(fd);
tcsetattr(fd,TCSANOW,&oldtio);
return EXIT_SUCCESS;
}
Sungoserialcapture
Diese Programm liest die Interfacedaten und schreibt die Daten ohne Auswertung zur weiteren Bearbeitung in ein Datei. Auch in diesem Programm sind noch die alten Varianten der Konvertierungsfunktionen vorhanden. Dies ist zwar nicht elegant, aber es funktioniert.
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h> // termios is the API that is in general recommended for serial I/O in Unix.
#include <curses.h>
#define BAUDRATE B115200
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
char datum[11];
char uhrzeit[7];
char temperatur[8];
char prozent[7];
char fehler[17];
char stunden[8];
char dummy[7];
unsigned int hextodec(char hex[10]){
unsigned int decimal=0;
unsigned int length=0;
unsigned int base = 1;
int i=0;
while(hex[i]!='\0'){
i++;
}
length=i;
//printf("hextodec %s\n\r",hex);
//printf("length %d\n\r",length);
for(i = length-1; i >= 0; i--){
//printf("i: %d\n\r",i);
if (i<0)i=0;
if(hex[i] >= '0' && hex[i] <= '9'){
decimal += ((unsigned char)hex[i] - 48) * base;
base *= 16;
}
else if(hex[i] >= 'A' && hex[i] <= 'F'){
decimal += ((unsigned char)hex[i] - 55) * base;
base *= 16;
}
else if(hex[i] >= 'a' && hex[i] <= 'f'){
decimal += ((unsigned char)hex[i] - 87) * base;
base *= 16;
}
}
//printf("decimal %d\n\r",decimal);
return decimal;
}
void datumformatieren(unsigned char lowbyte,unsigned char highbyte){
char data[10]="";
char tmp[3]="";
char datumStr_formatted[]="00.00.2021";
char datumStr[5]="";
unsigned int datumInt;
size_t l;
sprintf(tmp,"%X",highbyte);
strcpy(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
sprintf(tmp,"%X",lowbyte);
strcat(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
//strcpy(data,"0135");
//printf("data: %s\n\r",data);
datumInt=hextodec(data);
//printf("int: %d\n\r",datumInt);
sprintf(datumStr,"%d",datumInt);
if(strlen(datumStr)==3){
datumStr_formatted[0]=datumStr[1];
datumStr_formatted[1]=datumStr[2];
datumStr_formatted[4]=datumStr[0];
strcpy(datum,datumStr_formatted);
}
else if(strlen(datumStr)==4){
datumStr_formatted[0]=datumStr[2];
datumStr_formatted[1]=datumStr[3];
datumStr_formatted[3]=datumStr[0];
datumStr_formatted[4]=datumStr[1];
strcpy(datum,datumStr_formatted);
}
else{
strcpy(datum,"Error!");
}
return;
}
void uhrzeitformatieren(unsigned char lowbyte,unsigned char highbyte){
char data[10]="";
char tmp[3]="";
char uhrzeitStr_formatted[]="00:00";
unsigned int uhrzeitInt, stunden, minuten;
size_t l;
sprintf(tmp,"%X",highbyte);
strcpy(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
sprintf(tmp,"%X",lowbyte);
strcat(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
//strcpy(data,"1500");
//printf("data: %s\n\r",data);
uhrzeitInt=hextodec(data);
//printf("int: %d\n\r",uhrzeitInt);
stunden=(unsigned int)uhrzeitInt/60;
minuten=uhrzeitInt-(stunden*60);
if(TRUE){ // hier koennte man die gueltig der stunden und minuten noch testen
sprintf(uhrzeitStr_formatted,"%d:%d",stunden,minuten);
strcpy(uhrzeit,uhrzeitStr_formatted);
}
else{
strcpy(uhrzeit,"Error!");
}
return;
}
void temperaturformatieren(unsigned char lowbyte,unsigned char highbyte){
char data[10]="";
char tmp[3]="";
char temperaturStr_formatted[]="000.0°C";
unsigned int temperaturInt;
float temperaturFloat;
size_t l;
sprintf(tmp,"%X",highbyte);
strcpy(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
sprintf(tmp,"%X",lowbyte);
strcat(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
//strcpy(data,"1500");
//printf("data: %s\n\r",data);
temperaturInt=hextodec(data);
//printf("int: %d\n\r",temperaturInt);
temperaturFloat=(float)temperaturInt/10.0;
if(TRUE){
sprintf(temperaturStr_formatted,"%.1f°C",temperaturFloat);
strcpy(temperatur,temperaturStr_formatted);
}
else{
strcpy(temperatur,"Error!");
}
return;
}
void prozentformatieren(unsigned char byte){
char data[10]="";
char tmp[3]="";
char prozentStr_formatted[]="000%";
unsigned int prozentInt;
size_t l;
sprintf(tmp,"%X",byte);
strcpy(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
//strcpy(data,"1500");
//printf("data: %s\n\r",data);
prozentInt=hextodec(data);
//printf("int: %d\n\r",prozentInt);
if(TRUE){
sprintf(prozentStr_formatted,"%d%%",prozentInt);
strcpy(prozent,prozentStr_formatted);
}
else{
strcpy(prozent,"Error!");
}
return;
}
void stundenformatieren(unsigned char lowbyte,unsigned char highbyte){
char data[10]="";
char tmp[3]="";
char stundenStr_formatted[]="000000h";
unsigned int stundenInt;
sprintf(tmp,"%X",highbyte);
strcpy(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
sprintf(tmp,"%X",lowbyte);
strcat(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
//strcpy(data,"1500");
//printf("data: %s\n\r",data);
stundenInt=hextodec(data);
//printf("int: %d\n\r",temperaturInt);
if(TRUE){
sprintf(stundenStr_formatted,"%dh",stundenInt);
strcpy(stunden,stundenStr_formatted);
}
else{
strcpy(stunden,"Error!");
}
return;
}
void fehlerformatieren(unsigned char byte1,unsigned char byte2,unsigned char byte3,unsigned char byte4,unsigned char byte5,unsigned char byte6,unsigned char byte7,unsigned char byte8){
char data[10]="";
char tmp[3]="";
char fehlerStr_formatted[9];
unsigned int fehlerInt;
fehlerInt=12345;
if(TRUE){
sprintf(fehlerStr_formatted,"%d",fehlerInt);
strcpy(fehler,fehlerStr_formatted);
}
else{
strcpy(fehler,"Error!");
}
return;
}
void dummyformatieren(unsigned char lowbyte,unsigned char highbyte){
char data[10]="";
char tmp[3]="";
sprintf(tmp,"%X",highbyte);
strcpy(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
sprintf(tmp,"%X",lowbyte);
strcat(data,tmp);
//l=strlen(data);
//printf("data: %s (%d)\n\r",data,l);
if(TRUE){
strcpy(dummy,data);
}
else{
strcpy(dummy,"Error!");
}
return;
}
int main(int argc, char **argv)
{
FILE *fp;
struct termios oldtio,newtio;
int fd;
int c;
int res;
int i,k,l;
unsigned int x,y,z,t1,t2,dsIndex, dfIndex, dfX, dfY, sort1,sort2, stelle, zeilenproblock;
unsigned int state=0, syncstate=0;
unsigned char buf[1];
unsigned char merker[6];
unsigned char datensatz[100];
unsigned char datenfeld[100];
unsigned char datenfelder[50][16];
char data[10]="";
char tmp[3]="";
bool printflag;
// wenn in Kommandozeile die Schnittstelle mitgegeben wird, dann nimm diese sonst veruche default
if (argc > 1)
fd = open(argv[1], O_RDWR | O_NOCTTY );
else
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
if (fd <0) {
perror(MODEMDEVICE);
exit(-1);
}
// sichere die aktuellen Einstellungen
tcgetattr(fd,&oldtio);
// baue die neuen Einstellungen zusammen
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | IXON | IXOFF;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
newtio.c_cc[VMIN] = 5; /* blocking read until 5 chars received */
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
setvbuf(stdout, (char *)NULL, _IONBF, 0);
fp=fopen("sungocapture.bin","w");
if (fp == NULL)
return 0;
while (STOP==FALSE) { /* loop for input */
res = read(fd,buf,1); /* returns after 5 chars have been input */
//printf("A: syncstate: %d, state: %d, %X\n\r",syncstate,state,buf[0]);
fputc(res,fp);
}
fclose(fp);
close(fd);
tcsetattr(fd,TCSANOW,&oldtio);
return EXIT_SUCCESS;
}