Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Hardware » Schrittmotor über die serielle Schnittstelle

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.12.2004, 20:39 Uhr
mike
Pinguinhüpfer
(Operator)


Das ist nicht ANSI C. Ich verschieb dich mal
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Hardware ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: