Forum: PC-Programmierung Serielle Schnittstelle


von Karsten Lukas (Gast)


Lesenswert?

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

von Oha (Gast)


Lesenswert?

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.

von Karsten Lukas (Gast)


Lesenswert?

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?

von Jürgen G. (jg32)


Lesenswert?

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.

von Karsten Lukas (Gast)


Lesenswert?

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!!

von Jürgen G. (jg32)


Lesenswert?

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;
}

von Karsten Lukas (Gast)


Lesenswert?

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

von Jürgen G. (jg32)


Lesenswert?

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
Noch kein Account? Hier anmelden.