000
15.12.2004, 18:23 Uhr
~Gast_123
Gast
|
Hallo zusammen,
beschäftige mich schon seit einer Weile mit C bzw. ärgere mich damit rum ;-) und nun möchte ich mit einem Schrittmotor über die RS232 in C arbeiten.... Das Protkoll für die Schnittstelle hab ich schon geschrieben, im Netz gabs zum Glück sehr viel drüber zu finden. Dann hab ich ein Testprogramm geschrieben, konnte auch schon Befehle über die Schnittstelle an den Motor schicken, hat soweit alles geklappt, war schon richtig happy mit dem Ergebnis, nun kommts aber, mein Motor schickt mir Rückgabewerte zurück, die ich später verarbeiten will. Stell mir das irgendwo vor das die empfangene Daten z.B. in einem array gespeichert werden, oder lieg ich da falsch ? Würde das anfangs über ein nullmodemkabel erstmal testen... Vielleicht könnt ihr mal meine quellcodes anschauen, bin über jede Hilfe dankbar!
C++: |
#include "serial_lib.h" #include <stdio.h>
HANDLE serialOpen (unsigned int nPort, unsigned int nBaud, unsigned int nBits, unsigned int nStopp, unsigned int nParity) { char cPort[15]; HANDLE uiHcomm = NULL; COMMTIMEOUTS timeouts; DCB dcb;
sprintf(cPort, "\\\\.\\COM%u", nPort);
uiHcomm = CreateFile (cPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// konnte die serielle Schnittstelle geöffnet werden ?? if (uiHcomm == NULL) { printf("%s konnte nicht geoeffnet werden\n", cPort); return 0; }
timeouts.ReadIntervalTimeout = 200; timeouts.ReadTotalTimeoutMultiplier = 200; timeouts.ReadTotalTimeoutConstant = 200; timeouts.WriteTotalTimeoutMultiplier = 200; timeouts.WriteTotalTimeoutConstant = 200;
if(!SetCommTimeouts(uiHcomm, &timeouts)) { serialClose(uiHcomm); printf("Setzen der Timeouts fuer %s schlug fehl\n", cPort); return 0;
}
ZeroMemory(&dcb, sizeof(dcb));
if(!GetCommState(uiHcomm, &dcb)) { printf("DCB von %s konnte nicht gelesen werden\n", cPort); serialClose(uiHcomm); return 0; }
dcb.DCBlength = sizeof(DCB); dcb.fBinary = TRUE; dcb.fParity = TRUE; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; dcb.fDtrControl = DTR_CONTROL_ENABLE; dcb.fDsrSensitivity = FALSE; dcb.fTXContinueOnXoff = TRUE; dcb.fOutX = FALSE; dcb.fInX = FALSE; dcb.fErrorChar = FALSE; dcb.fNull = FALSE; dcb.fRtsControl = RTS_CONTROL_ENABLE; dcb.fAbortOnError = FALSE; dcb.wReserved = 0; // muss immer null sein dcb.BaudRate = nBaud; dcb.ByteSize = (BYTE)nBits; dcb.Parity = (BYTE)nParity; dcb.StopBits = (BYTE) nStopp; dcb.fParity = (dcb.Parity != NOPARITY);
if(!SetCommState(uiHcomm, &dcb)) { printf("DCB von %s konnte nicht geschrieben werden\n", cPort); serialClose(uiHcomm); return 0; }
printf("Juppiiii %s ist geoeffnet...\n", cPort); return uiHcomm; }
unsigned int serialClose (HANDLE nHandle) { if (!nHandle) { CloseHandle(nHandle); } printf("serielle Schnittstelle wurde geschlossen...\n"); return 1; }
unsigned int serialModeSet (HANDLE nHandle, unsigned int nBaud, unsigned int nBits, unsigned int nStopp, unsigned int nParity) { DCB dcb;
ZeroMemory(&dcb, sizeof(dcb));
if(!GetCommState(nHandle, &dcb)) { printf("DCB konnte nicht gelesen werden\n"); serialClose(nHandle); return 0; }
dcb.DCBlength = sizeof(DCB); dcb.fBinary = TRUE; dcb.fParity = TRUE; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; dcb.fDtrControl = DTR_CONTROL_ENABLE; dcb.fDsrSensitivity = FALSE; dcb.fTXContinueOnXoff = TRUE; dcb.fOutX = FALSE; dcb.fInX = FALSE; dcb.fErrorChar = FALSE; dcb.fNull = FALSE; dcb.fRtsControl = RTS_CONTROL_ENABLE; dcb.fAbortOnError = FALSE; dcb.wReserved = 0; // muss immer null sein dcb.BaudRate = nBaud; dcb.ByteSize = (BYTE)nBits; dcb.Parity = (BYTE)nParity; dcb.StopBits = (BYTE) nStopp; dcb.fParity = (dcb.Parity != NOPARITY);
if(!SetCommState(nHandle, &dcb)) { printf("DCB konnte nicht geschrieben werden\n"); serialClose(nHandle); return 0; } return 1; }
unsigned int serialReadData (HANDLE nHandle, char *pcData) { DWORD dwRead = 0; char chRead; unsigned int i = 0;
if (nHandle == NULL) return 0;
while(ReadFile(nHandle, &chRead, 1, &dwRead, NULL)) { if(dwRead != 1) break;
pcData[i++] = chRead; }
return i; }
unsigned int serialWriteData (HANDLE nHandle, const char *buffer, unsigned int uiBytesToWrite) { DWORD dwBytesWritten = 0;
if (nHandle == NULL) return 0; WriteFile(nHandle, buffer, uiBytesToWrite, &dwBytesWritten, NULL);
return (unsigned int)dwBytesWritten; }
unsigned int serialWriteCommByte (HANDLE nHandle, char nData) { if (nHandle == NULL) return 0;
if (!TransmitCommChar(nHandle, nData)) return 0;
return 1;
}
|
Hier das Testprogramm:
C++: |
#pragma hdrstop
#include "serial_lib.h" #include <stdio.h>
#pragma argsused int main(int argc, char* argv[]) {
HANDLE com4; char data[] = {0x30,0x31,0x32,0x33,0x34};
com4 = serialOpen (4, 2400, 8, 1, 0);
serialModeSet(com4, 2400, 8, 0, 0);
serialWriteData(com4, data,5); serialReadData(com4, data); serialClose(com4);
while(1); return 0; }
|
Bearbeitung von Pablo: |
Wenn du CPP Tags nicht selber benutzt, dann ersperre ich den Thread. Also CPP Tags selber benutzen!
|
Dieser Post wurde am 15.12.2004 um 20:42 Uhr von Pablo editiert. |