Re: Download Tool Kategorie: Verschiedenes (von Markus A. - 6.03.2004 21:19) | ||
Als Antwort auf Re: Download Tool von Thomas - 6.03.2004 15:58 | ||
| ||
> So, hab den C-Quellcode jetz soweit umgeschrieben, das er funktionieren sollte. Ich bekomme > auch auf jedes übertragene Byte ein korrektes Echo, aber nach der �bertragung der konstanten > Bytes schaltet die C-Control wieder auf HOSTMODE und somit werden die VMC-Codeworte > nicht übertragen. > Woran kann das liegen? Ich übertrage erst die 64 als 64,0,0,0 und bekomme 64,0,0,0 als Echos. > Anschlie�end das gleiche mit der 32 und dann die restlichen Worte mit je 2 Byte 1,0... > Grüss Dich Thomas, eine Sache ging mir erst sehr spät auf, nachdem ich selbst eine Weile rumprobiert hatte: Die Konstantbytes sind Bytes und müssen als Bytes übertragen werden und die VCM-Code-Worte eben als Integer-Werte (=2 Bytes). Hier meine Version eines Linux Downloadtools, es funktioniert, aber es ist zugegebenermassen sehr "quick and dirty" programmiert: Melde Dich mal, ob es bei Dir auch geht Markus #include <stdio.h> /* Standard input/output definitions */ #include <stdlib.h> #include <netinet/in.h> #include <string.h> /* String function definitions */ #include <unistd.h> /* UNIX standard function definitions */ #include <fcntl.h> /* File control definitions */ #include <errno.h> /* Error number definitions */ #include <termios.h> /* POSIX terminal control definit */ // Seriellen Port initialisieren int open_port(char *device) { int fd; struct termios *current; struct termios options; fd = open(device, O_RDWR | O_NOCTTY); if (fd == -1) return -1; bzero(&options, sizeof(options)); tcgetattr(fd, &options); options.c_cflag = B19200 | CRTSCTS | CS8 | CLOCAL | CREAD; options.c_iflag = IGNPAR; options.c_oflag = 0; options.c_lflag = 0; tcflush(fd, TCIFLUSH); tcsetattr(fd, TCSANOW, &options); return (fd); } int sendprog(char *filen, int sfd) { char CMD_RESET = 255; char CMD_INFO = 0; char CMD_DATE = 1; char CMD_VERSION = 2; char CMD_LOAD = 4; char CMD_ERASE_VMC = 6; int fd, i = 0; long int length, length2; char ch; char buf [255]; FILE *f; char Zeichen; char Text[10000000]; char Word[80]; long Codes[1000000]; int DateiLaenge; int Pos; int WordLength; long ix, iz; int jj; long m, n, m1, n1, q; long a, b, c, j; long pause; char fehler; pause = 5000; int GetWord() { char C; WordLength = 0; Word[0] = ' '; while (1) { /* printf("%d %d n", DateiLaenge, Pos); */ /* if reach the end of the file, leave, reporting failure */ if (Pos == DateiLaenge) return 0; C = Text[Pos]; /* if hit the end of the word, leave, otherwise record the current character in the array Word */ if (C == ' ' || C == 'n' || C == 13) { Pos++; if (WordLength != 0) break; } else { Word[WordLength] = C; WordLength++; Pos++; Word[WordLength] = ' '; } } return 1; } // Info der Unit auslesen und anzeigen printf("nLinux DownloadTool Version 0.1nn"); for (i=0; i<=255; i++) buf[i] = 0; write(sfd, &CMD_INFO, 1); usleep(100000); read(sfd, buf, 255); printf("%s ", buf); for (i=0; i<=255; i++) buf[i] = 0; write(sfd, &CMD_VERSION, 1); usleep(100000); read(sfd, buf, 255); printf("Version: %s ", buf); for (i=0; i<=255; i++) buf[i] = 0; write(sfd, &CMD_DATE, 1); usleep(100000); read(sfd, buf, 255); printf("vom: %sn", buf); // VMC Datei auslesen und in der Varialbe Text speichern f = fopen(filen, "r"); DateiLaenge=0; while (!feof(f)) { Zeichen = fgetc(f); Text[DateiLaenge] = Zeichen; DateiLaenge++; } Text[DateiLaenge+1] = ' '; fclose(f); // Aus der Variable Text die einzelnen Code-Werte bestimmen Pos = 0; j = 0; i = 0; while (GetWord() != 0) { if (j == 1) sscanf(Word, "%ld", &m); if (j == 2) sscanf(Word, "%ld", &n); if (j > 2) {sscanf(Word, "%ld", &a); Codes[j-3] = a; }; j++; }; printf("%s : ", filen); printf("KonstantenBytes : %ld; CMD-Code-Worte %ldn", m, n); //VMC löschen write(sfd, &CMD_ERASE_VMC, 1); //2500ms warten usleep(2500000); read(sfd, buf, 1); // printf("%dn", buf[0]); //Laden des VMC-Codes einleiten write(sfd, &CMD_LOAD, 1); usleep(500000); // Anzahl der KonstantenBytes m übergeben m1 = m; n1 = n; for (i=1; i<=4; i++) { jj = m1 % 256; write(sfd, &jj, 1); usleep(pause); read(sfd, buf, 1); a = buf[0]; if (a<0) a = 256+a; // printf("%d ", a); m1 = m1/256; }; // printf("n"); // Anzahl der VCM-Code-Worte n übergeben for (i=1; i<=4; i++) { jj = n1 % 256; write(sfd, &jj, 1); usleep(pause); read(sfd, buf, 1); a = buf[0]; if (a<0) a = 256+a; // printf("%d ", a); n1 = n1/256; }; // printf("n"); printf("�bertragung beginnt ...n"); fehler = 0; for (i=0; i<= (m+n-1); i++) { jj = Codes[i] % 256; write(sfd, &jj, 1); usleep(pause); read(sfd, buf, 1); a = buf[0]; if (a<0) a = 256+a; if (a != jj) fehler = 1; // printf("%d : %d ", i, a); // if (i<m) printf(" < ConstByten"); if (i>m-1) { jj = Codes[i] / 256; write(sfd, &jj, 1); usleep(25000); read(sfd, buf, 1); b = buf[0]; if (b<0) b = 256+b; if (b != jj) fehler = 1; c = a + 256*b; // printf("%d : %d < VCM-Coden", b, c); } } if (fehler == 1) printf("n�bertragung war fehlerhaft!nn"); if (fehler == 0) printf("n�bertragung war erfolgreich!nn"); // Reset der Unit write(sfd, &CMD_RESET, 1); return 0; } // Bei Aufruf des DownloadTools aus eienr Shell muss die Datei // mit angegeben werden, z. B. ./dltool beeper.c2p.vmc int main(int arc, char *argv[]) { int comport = open_port("/dev/ttyS0"); sendprog(argv[1], comport); } | ||
Antwort schreiben Antworten: Re: Download Tool (von n4x - 7.03.2004 16:52) Re: Download Tool (von Markus A. - 7.03.2004 18:04) Re: Download Tool (von n4x - 7.03.2004 22:15) Re: Download Tool (von Markus A. - 8.03.2004 0:01) Re: Download Tool (von Thomas - 7.03.2004 12:24) Re: Download Tool (von Thomas - 7.03.2004 14:30) Re: Download Tool (von Markus A. - 7.03.2004 18:02) Re: Download Tool (von Thomas - 7.03.2004 22:23) Re: Download Tool (von Markus A. - 8.03.2004 0:03) Re: Download Tool (von Thomas - 8.03.2004 0:50) |