Serielle Schnittstelle

Gast #1195166
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
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.
Gast #1195218
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?
#1195228
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.
Gast #1195255
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!!
#1195303
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.