Serielle Schnittstelle

Gast #1195166
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
Gast #1195200
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.
#1195228
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.
#1195303
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;
}
Gast #1195334
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren