www.mikrocontroller.net

Forum: PC-Programmierung Serielle Schnittstelle


Autor: Karsten Lukas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karsten Lukas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jürgen G. (jg32)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karsten Lukas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!

Autor: Jürgen G. (jg32)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Karsten Lukas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jürgen G. (jg32)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.