Uhrzeit stellen mit XPort Kategorie: Programmierung (von jmanbln - 15.11.2006 11:07) | ||
| ||
Für alle die, die auch immer Empfangsprobleme mit dem DCF77 haben, hier eine Alternative zum Stellen der Systemzeit. Dabei wird über den XPort ein beliebiger HTTP-Server mit "HEAD" angefragt und der Header, der als Echo zurückkommt ausgewertet. Sicherlich ist die Methode nicht so genau, wie ein DCF77, da die Genauigkeit von der Genauigkeit des Webservers und der Antwortzeit abhängt. Der ConnectMode des XPort muss auf C4 gesetzt sein. /* ----------------------------------------------------------------- */ /* */ /* HTTP-Request um Zeit abzufragen */ /* Format: */ /* "HEAD / HTTP/1.1" + CRLF + "Host: www.tu-berlin.de" + CRLF + CRLF */ /* */ /* ----------------------------------------------------------------- */ function requestTime() { string send_String; // Verbindung zum Server herstellen cap.Capture(debug.HWCOM_CAPTURE); send_String = "C130.149.4.134/80"; str.putchar(send_String, 0x0D); hwcom.print2(send_String); wait hwcom.ready(); // jetzt Message senden send_String = "HEAD / HTTP/1.1"; str.putchar(send_String, 0x0D); str.putchar(send_String, 0x0A); hwcom.print2(send_String); send_String = "Host: www.tu-berlin.de"; str.putchar(send_String, 0x0D); str.putchar(send_String, 0x0A); str.putchar(send_String, 0x0D); str.putchar(send_String, 0x0A); hwcom.print2(send_String); wait hwcom.ready(); cap.Release(debug.HWCOM_CAPTURE); } /* ----------------------------------------------------------------- */ /* */ /* Zeit und Datum stellen, mit Header aus HTTP-Request */ /* */ /* ----------------------------------------------------------------- */ function setTime(byte buffer[]) { int i, start, t1, t2, t3; for i = 0...62 { if buffer[i] == 13 and buffer[i + 1] == 10 { start = i + 13; break; } } t1 = (buffer[start] - 48) * 10 + (buffer[start + 1] - 48); // Tag t3 = (buffer[start + 7] - 48) * 1000 + (buffer[start + 8] - 48) * 100 + (buffer[start + 9] - 48) * 10 + (buffer[start + 10] - 48); // Jahr // Monat: i = buffer[start + 3] + buffer[start + 4] + buffer[start + 5]; if i == 281 t2 = 1; if i == 269 t2 = 2; if i == 288 t2 = 3; if i == 291 t2 = 4; if i == 295 t2 = 5; if i == 301 t2 = 6; if i == 299 t2 = 7; if i == 285 t2 = 8; if i == 296 t2 = 9; if i == 294 t2 = 10; if i == 307 t2 = 11; if i == 286 t2 = 12; system.setdate(t3, t2, t1); // setzt auch das Sommerzeitflad DST neu t1 = (buffer[start + 12] - 48) * 10 + (buffer[start + 13] - 48); // Stunde t2 = (buffer[start + 15] - 48) * 10 + (buffer[start + 16] - 48); // Minute t3 = (buffer[start + 18] - 48) * 10 + (buffer[start + 19] - 48); // Sekunde // Zeitverschiebung zur GMT und Sommerzeit berücksichtigen if system.dst() t1 = t1 + 2; else t1 = t1 + 1; if t1 > 23 t1 = t1 - 24; system.settime(t1, t2, t3); } /* ----------------------------------------------------------------- */ /* */ /* Empfangs-Thread */ /* */ /* ----------------------------------------------------------------- */ thread receive { byte first_byte, second_byte; int anz_bytes, len; byte rec_buffer[128]; hwcom.init(); hwcom.setspeed(hwcom.SPEED_19200); hwcom.setbuf(HWcombuf,128); // Empfangspuffer auf 128 Byte erhöhen hwcom.flush(); // Buffer leeren loop { wait hwcom.rxd(); // 1. Byte empfangen cap.Capture(debug.HWCOM_CAPTURE); first_byte = hwcom.get(); if first_byte == CMD // Befehlssequenz wird eingeleitet { // weitere Anweisungen... } else if first_byte == 72 // ein "H" empfangen { wait hwcom.rxd(); // 2. Byte empfangen second_byte = hwcom.get(); if second_byte == 84 // ein "T" empfangen, HEADer eines HTTP-Requests { len = hwcom.receive(rec_buffer, 80, 2000); if len >= 64 setTime(rec_buffer); // Zeit und Datum stellen } } hwcom.flush(); // Empfangspuffer leeren cap.Release(debug.HWCOM_CAPTURE); } } Gru� Jens | ||
Antwort schreiben Antworten: Re: Uhrzeit stellen mit XPort (von Bert - 30.10.2010 11:14) |