Schrittmotor über die serielle Schnittstelle
-
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!#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:
//--------------------------------------------------------------------------- #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; } //---------------------------------------------------------------------------
Edit by AJ: CPP-Tags (C/C++) eingefügt. Bitte das nächste mal selber verwenden (die Tags sind gleich unter den Smilies zu finden ;))
-
Das Thema und dein Code haben leider nur wenig mit ANSI-C zu tun. Im Konsolenforum gabs schon öffter Threads über die Serielle Schnittstelle und in der FAQ des Konsolenforums ( http://www.c-plusplus.net/forum/viewforum.php?f=20 ) gibt es sogar komplett fertige Sachen, um Daten über die serielle Schnittstelle zu senden und zu empfangen. Schau es dir einfach mal an.
Und nun ab ins Konsolenforum :).
-
Dieser Thread wurde von Moderator/in AJ aus dem Forum ANSI C in das Forum DOS und Win32-Konsole verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ich war mal auf dem gleichen Trip wie du aber hab dann bald erkannt das die USB Schnittstelle mehr Möglichkeiten bietet.
Also meine Empfehlung wäre USB allein schon wegen der einfacheren Handhabung.