Hallo, ich hätte mal eine Frage zu der seriellen Schnittstelle. Ich habe ein lauffähiges Programm für einen Atmega128L, und es ist mir auch möglich über das HyperTerminal von MS daten über die serielle Schnittstelle zu empfangen und zu senden. Jetzt möchte ich mir gerne meine eigene Oberfläche generieren, vielleicht gleich in C, vermute mal das geht am schnellsten. Hat vielleicht jemand Beipsielcode dazu, wie man soetwas programmiert? Karsten
Naja. ein C Umgebung plus die Serial library. Darf ich davon ausgehen, dass du beides noch nicht hast. Noch wenig bis keine Erfahrung mit windows programmierung hast ? Das wird ein stueck Arbeit werden.
Also eine Programmierumgebung habe ich, und ein wenig Erfahrung in der Programmierung habe ich auch aber nur C. Die Seriel library habe ich nicht. Kannst du mir weiterhelfen?
Meinst Du, eine aehnliche Oberflaeche wie Hyperterminal, also ein Programm, das Bytes als Zeichenketten im Text-Window darstellt und Tastendruecke als Ascii-Bytes an die serielle Schnittstelle ausgibt? Da haette ich ein kleines Programm, allerdings unter der MinGW32-Umgebung.
Ja genau das meine ich:-) Das MinGW32 Programm kann ich doch auch unter VisualStudio compilieren oder? Wäre sehr nett wenn ich das haben könnte von dir!!
Das ist hier ein Grundgeruest als Konsolen-Programm. Weiss gar nicht mehr welchen Zweck es genau verfolgt hat, aber es hat erfolgreich mit einen Atmega48 kommuniziert vor ein paar Jahren. Die empfangenen Zeichen habe ich da gepollt. Mit Callbacks kann man das viel elleganter loesen. Da ich umgestiegen bin auf Java, habe ich den C-Ansatz nicht mehr fertiggestellt. (Man braucht dazu die Comm-Library.) #include <windows.h> #include <stdio.h> #include <conio.h> int main(void) { DCB dcb; HANDLE hPort; DWORD EvtMask; COMMTIMEOUTS cto; DWORD dw; unsigned char buf[0x100],buf2[0x100]; int i; dcb.DCBlength=sizeof(DCB); dcb.BaudRate=CBR_9600; dcb.fBinary=1; dcb.fParity=0; dcb.fOutxCtsFlow=0; dcb.fOutxDsrFlow=0; dcb.fDtrControl=DTR_CONTROL_DISABLE; dcb.fDsrSensitivity=0; dcb.fTXContinueOnXoff=0; dcb.fOutX=0; dcb.fInX=0; dcb.fErrorChar=0; dcb.fNull=0; dcb.fRtsControl=RTS_CONTROL_DISABLE; dcb.fAbortOnError=0; dcb.fDummy2=0;dcb.wReserved=0; dcb.XonLim=1; dcb.XoffLim=256; dcb.ByteSize=8; dcb.Parity=NOPARITY; dcb.StopBits=ONESTOPBIT; dcb.XonChar=0; dcb.XoffChar=1; dcb.ErrorChar=2; dcb.EofChar=3; dcb.EvtChar=4; dcb.wReserved1=0; cto.ReadIntervalTimeout=20; cto.ReadTotalTimeoutMultiplier=10; cto.ReadTotalTimeoutConstant=40; cto.WriteTotalTimeoutMultiplier=10; cto.WriteTotalTimeoutConstant=40; hPort=CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, //bidirectional 0, NULL, //no security OPEN_EXISTING, //this must be set; FILE_ATTRIBUTE_NORMAL, // maybe with |FILE_FLAG_OVERLAPPED NULL); if (hPort==INVALID_HANDLE_VALUE) {printf("CreateFile\n"); return 1;} if (!SetCommState(hPort,&dcb)) {printf("SetCommState\n"); return 1;} if (!SetupComm(hPort,256,256)) {printf("SetupComm\n"); return 1;} if (!SetCommMask(hPort, EV_RXCHAR)) {printf("SetCommMask\n"); return 1;} SetCommTimeouts(hPort,&cto); while (1) { /*char s[0x10]; fgets(s,sizeof(s),stdin); printf("\"%s\"",s);*/ buf[0]=7; buf[1]=3; if (!WriteFile(hPort, buf, 1, &dw,NULL)) {printf("WriteFile\n"); return 1;} if (!WaitCommEvent(hPort,&EvtMask,NULL)) { char str[0x100]; DWORD dwerr; dwerr=GetLastError(); printf("WaitCommEvent: %lu\n", dwerr); return 1; } else { if (EvtMask==EV_RXCHAR) { ReadFile(hPort,buf2,8,&dw,NULL); for (i=0;i<3;i++) printf("%d,%u\n",i+1,buf2[i]); } } if (kbhit()) { if (getchar()=='q') break; } Sleep(200); } CloseHandle(hPort); return 0; }
Hey Jürgen, also ich habe jetzt mal dein Programm laufen lassen, das funktioniert nicht korrekt, es werden nur 3 Zahlen ausgegeben (ohne Sinn). Ich werd mal schauen ob ichs selber noch anpassen kann. Aber Danke trotzdem
Hallo, fuer meine damalige Anwendung mag das Sinn gemacht haben. Aber man kann sehen, welche Funktionen/Strukturen benoetigt werden und wie diese initialisiert werden muessen. J.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.