D
Besten Dank für die zahlreichen Antworten
OK, war ne Fragenstellung à la "schreib mir mal jemand ein Programm, welchen..."
Neuer Versuch: Ich hab selbst noch etwas recherchiert und hab es so einigermassen zun laufen gebracht, allerdings schmiert mir, wenn ich was auf den Komport sende, während das Gerät am Komport bereits sendet, dieses "Gerät" immer ab ( Testaufbau: DEV-PC <--> Null-Modem-Kabel <--> PC mit AccesPort)...
--> AccesPort ist zu finden unter http://www.sudt.com/en/
Währe FILE_FLAG_OVERLAPPED eine/die Lösung? Was bewirkt dieser Parameter überhaut (hab' z.Z. kein MSDN zur verfügung)?
Hier noch mal der aktuelle Test-Code (entschuldit die "Zukleisterei" bitte, aber die letzte Version war ein etwas arter Schlag meinerseits):
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <string.h>
#include <stdio.h>
#define MAX_SEND_BYTES 50
BOOL fDebugMode = TRUE;
BOOL setCOMSettings(HANDLE hPort)
{
DCB dcb;
COMMTIMEOUTS cto;
// set general settings
if(GetCommState(hPort,&dcb))
{
dcb.BaudRate = CBR_9600;
dcb.StopBits = ONESTOPBIT;
dcb.Parity = NOPARITY;
dcb.fParity = TRUE;
dcb.ByteSize = 8;
dcb.fBinary = TRUE;
dcb.wReserved = 0;
if(!SetCommState(hPort,&dcb))
return FALSE;
}
// set timeouts
if(GetCommTimeouts(hPort,&cto))
{
printf(">> %f\n",cto.ReadIntervalTimeout);
printf(">> %f\n",cto.ReadTotalTimeoutConstant);
printf(">> %f\n",cto.ReadTotalTimeoutMultiplier);
/*cto.ReadIntervalTimeout = 2000;
cto.ReadTotalTimeoutConstant = 2000;
cto.ReadTotalTimeoutMultiplier = 2000;
if(!SetCommTimeouts(hPort,&cto))
return FALSE;*/
}
return TRUE;
}
BOOL sendDataOverCOM(char cToSend[MAX_SEND_BYTES], HANDLE hPort)
{
unsigned long length = 0;
char cByteToSend[1];
for(int i = 0; i < MAX_SEND_BYTES; i++)
{
if(cToSend[i]!=NULL)
{
cByteToSend[0] = cToSend[i];
if(WriteFile(hPort, cByteToSend, 1, &length, NULL) == 0)
{
return FALSE;
}
}
else
{
break;
}
}
return TRUE;
}
BOOL getDataOverCOM(HANDLE hPort, int iLoops)
{
char cBuffer[1000];
DWORD dwLen;
int i = 0;
while(i<iLoops)
{
if(!ReadFile(hPort, cBuffer, 100, &dwLen, 0))
return FALSE;
else
{
printf("%s", &cBuffer);
i++;
}
}
printf("\n");
return TRUE;
}
int main(int argc, char *argv[])
{
// open port
HANDLE hCom;
hCom = CreateFile(
"COM1",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
// 0,
FILE_ATTRIBUTE_NORMAL,
// FILE_FLAG_OVERLAPPED,
NULL);
if(hCom == INVALID_HANDLE_VALUE)
printf("Could not open port!\n");
else
printf("COM-Port is open...\n");
// create overlapped structure
OVERLAPPED overlapped;
memset(&overlapped, 0, sizeof(overlapped));
overlapped.hEvent = CreateEvent(
NULL,
TRUE,
FALSE,
NULL);
// apply some settings
if(!setCOMSettings(hCom))
printf("Could not apply settings!\n");
else
printf("Settings are done...\n");
// send a string
if(!sendDataOverCOM("test", hCom))
printf("Could not send string!\n");
else
printf("String sent...\n");
// recieve some char signs
if(!getDataOverCOM(hCom, 20))
printf("Could not recieve data!\n");
else
printf("Data recieved...\n");
// close port
CloseHandle(hCom);
// wait for keyboard
getchar();
return EXIT_SUCCESS;
}
Danke
Dan