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