Serielle Schnittstelle - Serielle Daten
-
Hallo,
ich habe ein Gerät was über die Serielle Schnittstelle Daten wie
&GPP 122,12,34,67,43,678,423,0,0,0,0,0,67
sendet. Meine Frage wie kann ich diese Daten in mein Programm einlesen und bearbeiten.z.B. das ich für jede Zahl eine Variable nutzen kann also:
&GPP 122,12,34,67,43,678,423,0,0,0,0,0,67
a, b, c, b, e, f, g,h,i,j,k,l,mds er also die Zahlen zwischen den Komma in einer Variable schreibt.
-
Jo da hab ich doch noch ein Stück Code auf meinem PC mit Serialerschnit... (ja dinksta bumsta, ihr wist schon)
3 /* Wichtig ist dabei die Zeile #define PORT 0x2F8 da mußt du bei dir in der Systemsteuerung (GeräateManager) welcher E/A Beraich (Heißt so bei XP) nachschauen. */ /* Ampel.cpp Ampelschaltung */ #include <stdio.h> #include <time.h> #include <conio.h> #define PORT 0x2F8 unsigned int bits; void warten(int sekunden) { clock_t start; sekunden *= CLOCKS_PER_SEC; start = clock(); while( clock() < start + sekunden) ; } // Funktionen für Schaltzustände void rot() { printf("\nrot"); outp(PORT+4, inp(PORT+4) | 0x2 ); // Rot = RTS setzen outp(PORT+4, inp(PORT+4) & 0xFE); outp(PORT+3, inp(PORT+3) & 0xBF); warten(10); } void rot_gelb() { printf("\nrot\tgelb"); outp(PORT+4, inp(PORT+4) | 0x2); // Rot = RTS setzen outp(PORT+4, inp(PORT+4) | 0x1); // Gelb = DTR setzen outp(PORT+3, inp(PORT+3) & 0xBF); warten(2); } void gruen() { printf("\n\t\tgruen"); outp(PORT+3, inp(PORT+3) | 0x40); // Gruen = TxD setzen outp(PORT+4, inp(PORT+4) & 0xFE); outp(PORT+4, inp(PORT+4) & 0xFD); warten(6); } void gelb() { printf("\n\tgelb"); outp(PORT+4, inp(PORT+4) | 0x1); // Gelb = DTR setzen outp(PORT+4, inp(PORT+4) & 0xFD); outp(PORT+3, inp(PORT+3) & 0xBF); warten(3); } // Array von Zeigern auf Funktionen void (*fpointer[4]) (); int main() { int i; // Zeiger initialisieren (mit Funktionen) fpointer[0]=rot; fpointer[1]=rot_gelb; fpointer[2]=gruen; fpointer[3]=gelb; // Array durchlaufen (Ampel in Betrieb nehmen) for (i=0; i<=3; i++) fpointer[i](); return 0; }
-
Wo hat sich in den vielen Zeilen denn nur die MFC versteckt images/smiles/icon_confused.gif images/smiles/icon_confused.gif
MfG veganza
-
Hallo SaM,
Die Serielle Schnittstelle wir unter Windows wie eine Datei behandelt,
also mit ReadFile / WriteFile.für jede Zahl eine Variable ? ich würde ein Array nehmen, kommt jedoch auf den Verwendungszweck an.
Ein kleines Beispiel wie du die Eingelesenen Daten ( als String eingelesen )
in ein Int-Array speicherst und die Kommas rausfilterst.Solten ausßer "," und Zahlen noch andere Zeichen gesendet werden,
müßen diese noch herausgefiltert werden.CString strEmpfang; // deine empfangen Daten strEmpfang.Format("122,12,34,67,43,678,423,0,0,0,0,0,67"); int iaDeineZahlen[100]; // ein Array mit deinen Zahlen if (strEmpfang.GetLength() != 0) { CString strTemp; CString strZahl; strTemp.Format("%s",strEmpfang); int iFind =0; int nCount = 0; // druchlaufzähler while (iFind != -1) { iFind = strTemp.FindOneOf(","); int iLength = strTemp.GetLength(); // weil am Schluß kein Komma ist if (iFind != -1) strZahl.Format("%s",strTemp.Left(iFind )); else strZahl.Format("%s",strTemp.Right(iLength -iFind -1)); strTemp.Format("%s",strTemp.Right(iLength -iFind -1)); // eingelesene Zahl speichern iaDeineZahlen[nCount] = atoi(strZahl); nCount++; // weiterzählen //MessageBox(strZahl,strTemp); } CString test; for (int ii = 0; ii<nCount;ii++) { test.Format("%d",iaDeineZahlen[ii]); MessageBox(test); } }
-
-see signature-
So far ...
-
Hallo,
das mit dem String habe ich hinbekommen aber probehalber erstmal nur mit einer Datei. Jetzt habe ich mich gefragt wie ich mit ReadFile und WriteFile Arbeiten muß damit überhaupt etwas passiert. images/smiles/icon_rolleyes.gif
gruß SaM
-
Hallo SaM,
Schnittstelle öffnen zb. mit CreateFile mit dem zurückgegebene HANDLE zb. hComm
ReadFile(hComm,..)
im Prinzip wie bei einer Datei jedoch müssen die Daten an der Schnittstelle erst vorhanden sein.
Es giebt auch eine Benachichtigungsfunktion wenn daten vorhanden sind,
die fällt mir aber gerade nicht ein ich muß erst mal suchen.Ein Beispiel aus der Suche hir im Forum http://www.c-plusplus.net/ubb/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=1&t=004847
PS: Cookies annehmen, die gespeichet sind, dann klappts auch mit dem Registrierten Namen.
[ Dieser Beitrag wurde am 01.02.2002 um 22:38 Uhr von Paul editiert. ]
-
// Seriellport.h: Schnittstelle für die Klasse CSERIELL. #if !defined(SERIELLPORT_H) #define SERIELLPORT_H #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include <windows.h> class CSERIELL { public: CSERIELL(); ~CSERIELL(); bool Init(int iPort, int Baud =9600, int Size =8, int Parity =0, int stopbit=0, int fRtsControl =2, int Timeout =100, int TotalTimeout =1000); int Receive(void *PUFFER, int MAXBYTES); bool Send(void *PUFFER, unsigned int nBYTES); bool Close(); char* Geterror(); bool isOpen(); private: char* m_fehler; HANDLE m_hPort; }; #endif // Seriellport.cpp: Implementierung der Klasse CSERIELL. // #include "stdafx.h" #include "Seriellport.h" #include <stdio.h> #include <iostream.h> CSERIELL::CSERIELL() { this->m_error= NULL; this->m_hPort= 0; } CSERIELL::~CSERIELL() { this->Close(); } /sendet Daten zur seriellen Schnittstelle bool CSERIELL::Send(void *puffer, unsigned int len) { DWORD written= 0; if(isOpen()) { WriteFile(this->m_hPort, puffer, len, &written, NULL); } if(len == written) return true; return false; } //holt Daten von der seriellen Schnittstelle int CSERIELL::Receive(void *puffer, int len) { DWORD receive=0; if(m_hPort !=0 && len >0) { ReadFile(m_hPort, puffer, len, &receive, NULL); } if(receive==0) return receive; } //schließt die serielle Schnittstelle bool CSERIELL::Close() { if(isOpen()) { CloseHandle(this->m_hPort); this->m_hPort= 0; return true; } return false; } //Ist serielle Schnittstelle offen bool CSERIELL::isOpen() { if(m_hPort >0) return true; // this->m_error= ERROR_port_init; return false; } char* CSERIELL::Geterror() { return m_error; } bool CSERIELL::Init(int iPort, int iBaud, int iSize, int iParity, int stopbit, int fRtsControl, int iTimeout, int iTotalTimeout) { char port[]= "COM0123456789:"; sprintf(port, "COM%i:", iPort); m_hPort = CreateFile( port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if((int)this->m_hPort == -1) //COMx ist nicht vorhanden this->m_hPort=0; if(this->m_hPort !=0) { COMMTIMEOUTS comtime; GetCommTimeouts(this->m_hPort, &comtime); comtime.ReadIntervalTimeout= iTimeout; comtime.ReadTotalTimeoutConstant= iTotalTimeout; comtime.WriteTotalTimeoutConstant= iTotalTimeout; comtime.ReadTotalTimeoutMultiplier=2; comtime.WriteTotalTimeoutMultiplier=0; SetCommTimeouts(this->m_hPort, &comtime); DCB dcb; //Gerätekommunikationsanpassung GetCommState(this->m_hPort, &dcb); dcb.BaudRate= iBaud; dcb.ByteSize= iSize; dcb.DCBlength= 28; dcb.EofChar= 0; dcb.ErrorChar= 0; dcb.fRtsControl= fRtsControl; dcb.Parity= iParity; dcb.StopBits= stopbit; dcb.fInX=0; dcb.fOutX=0; dcb.fAbort O n E r r o r = 1; //Bitte hier die leerzeichen // wegmachen. Vermutlich Bug im Forum SetCommState(this->m_hPort, &dcb); return true; } return false; }
Die ist eine Klasse um mit der Serielle Schnittstelle zu arbeiten.
Header und cpp-datei.
Terminator hat eine Möglichkeit gezeigt wie sie unter WinNT nicht funktioniert. Ob sie WINNT funzt kann ich nicht testen.
W2K läßt aber solche zugriffe nicht zu. Deshalb die ´behandlung des Comports als File.[ Dieser Beitrag wurde am 01.02.2002 um 23:56 Uhr von Unix-Tom editiert. ]
[ Dieser Beitrag wurde am 01.02.2002 um 23:57 Uhr von Unix-Tom editiert. ]
[ Dieser Beitrag wurde am 01.02.2002 um 23:57 Uhr von Unix-Tom editiert. ]
[ Dieser Beitrag wurde am 01.02.2002 um 23:59 Uhr von Unix-Tom editiert. ]
[ Dieser Beitrag wurde am 02.02.2002 um 00:00 Uhr von Unix-Tom editiert. ]
[ Dieser Beitrag wurde am 02.02.2002 um 00:00 Uhr von Unix-Tom editiert. ]
[ Dieser Beitrag wurde am 02.02.2002 um 00:01 Uhr von Unix-Tom editiert. ]
[ Dieser Beitrag wurde am 02.02.2002 um 00:03 Uhr von Unix-Tom editiert. ]