Com Kommunikation
-
Hallo!
Bin neu hier.
Habe ein testprogrämchen geschrieben. kompilierung ergibt keine fehler, aber wenn ich den testknopf drücke kommt die meldung "Das System kann die angegebene Datei nicht finden"
Was mache ich denn nicht richtig???
Danke schonmal für die mühe!!
Bullachvoid CTestDlg::OnTest() { CString strTemp=_T("parity= data= stop="); strTemp.Insert(strTemp.Find(_T("data="))+5,_T("8")); strTemp.Insert(strTemp.Find(_T("stop="))+5,_T("1")); strTemp.Insert(strTemp.Find(_T("parity="))+7,_T("N")); CSerial serial; serial.Open(1,9600); int test = 85 ; HANDLE hCom; hCom=CreateFile ("\\.\\COM1:",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); if (hCom==INVALID_HANDLE_VALUE) { MessageBox("Zugriff auf den COM-Port fehgeschlagen!\n\tSenden nicht möglich!"); return ; } [b]serial.Write(&test,7);[/b] serial.Close(); return ; }
-
mach aus dem "\.\\COM1:" mal ein "\\\.\\COM1",
-
Habe die 2\ eingefügt und das ":" weg aber leider keine änderung.
-
-
bei mir sieht das ganze wie folgt aus:
//ÖFFNEN HANDLE Port; // steh bei mir in der Header DCB PortConfig; Port = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if(GetCommState(Port,&PortConfig) == 0) { //hier fehlerbehandlung return; } PortConfig.BaudRate = CBR_9600; PortConfig.StopBits = ONESTOPBIT; PortConfig.Parity = NOPARITY; PortConfig.ByteSize = 8; if(SetCommState(Port,&PortConfig) == 0) { //hier error; } //SENDEN unsigned long length = 0; CString sDaten = "hallo ich bin eine Nachricht"; if(WriteFile(Port, sDaten, sDaten.GetLength(), &length,NULL) == 0) { //hier fehlerbehandlung return; }
mfg Emperor_L0ser
-
Funzt leider nicht. Ich programmiere unter WIN NT. Also sowohl mit meinem code als auch vom Emperor_LOser gibt es bei mir probleme bei der ersten fehlerbehandlung.
void CTestDlg::OnTest() { HANDLE hCom; hCom=CreateFile ("\\.\\COM1:",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); if (hCom==INVALID_HANDLE_VALUE) { MessageBox("Zugriff auf den COM-Port fehgeschlagen!\n\tSenden nicht möglich!"); return ; } CString strTemp=_T("parity= data= stop="); strTemp.Insert(strTemp.Find(_T("data="))+5,_T("8")); strTemp.Insert(strTemp.Find(_T("stop="))+5,_T("1")); strTemp.Insert(strTemp.Find(_T("parity="))+7,_T("N")); CSerial serial; serial.Open(1,9600); int test = 85 ; serial.Write(&test,7); serial.Close(); return ; }
-
Wofür habe ich den Link zur Klasse gepostet. Geht es damit ?
-
ich verwende meinen code und es läuft wunderbar, auf meinem rechner läuft winxp.
kann es eventuell sein, das dein Com-Port belegt ist und du eventuell COM2 benötigst, oder eventuell auf einem Laptop arbeitest, bei denen sämtliche Externe anschlüsse gerne deaktviert werden?
-
Ich habe schon eine Serial.h von naughter.com deshalb bin ich nicht weitergegangen.
/* Module : SERIAL.H Purpose: Declaration for an MFC wrapper class for serial ports Created: PJN / 31-05-1999 Copyright (c) 1999 - 2002 by PJ Naughter. All rights reserved. */ ///////////////////// Macros / Structs etc ////////////////////////// #ifndef __SERIAL_H__ #define __SERIAL_H__ /////////////////////////// Classes /////////////////////////////////////////// ////// Serial port exception class //////////////////////////////////////////// void AfxThrowSerialException(DWORD dwError = 0); class CSerialException : public CException { public: //Constructors / Destructors CSerialException(DWORD dwError); ~CSerialException(); //Methods #ifdef _DEBUG virtual void Dump(CDumpContext& dc) const; #endif virtual BOOL GetErrorMessage(LPTSTR lpstrError, UINT nMaxError, PUINT pnHelpContext = NULL); CString GetErrorMessage(); //Data members DWORD m_dwError; protected: DECLARE_DYNAMIC(CSerialException) }; //// The actual serial class ///////////////////////////////////////////// class CSerial : public CObject { public: //Enums enum FlowControl { NoFlowControl, CtsRtsFlowControl, CtsDtrFlowControl, DsrRtsFlowControl, DsrDtrFlowControl, XonXoffFlowControl }; enum Parity { EvenParity, MarkParity, NoParity, OddParity, SpaceParity }; enum StopBits { OneStopBit, OnePointFiveStopBits, TwoStopBits }; //Constructors / Destructors CSerial(); virtual ~CSerial(); //General Methods void Open( int nPort, DWORD dwBaud = 9600, Parity parity = NoParity, BYTE DataBits = 8, StopBits stopbits = OneStopBit, FlowControl fc = NoFlowControl, BOOL bOverlapped = FALSE ); void Close(); void Attach(HANDLE hComm, BOOL bOverlapped = FALSE); HANDLE Detach(); operator HANDLE() const { return m_hComm; }; BOOL IsOpen() const { return m_hComm != INVALID_HANDLE_VALUE; }; #ifdef _DEBUG void Dump(CDumpContext& dc) const; #endif //Reading / Writing Methods DWORD Read(void* lpBuf, DWORD dwCount); BOOL Read(void* lpBuf, DWORD dwCount, OVERLAPPED& overlapped, DWORD* pBytesRead=NULL); void ReadEx(void* lpBuf, DWORD dwCount); DWORD Write(const void* lpBuf, DWORD dwCount); BOOL Write(const void* lpBuf, DWORD dwCount, OVERLAPPED& overlapped, DWORD* pBytesWritten=NULL); void WriteEx(const void* lpBuf, DWORD dwCount); void TransmitChar(char cChar); void GetOverlappedResult(OVERLAPPED& overlapped, DWORD& dwBytesTransferred, BOOL bWait); void CancelIo(); DWORD BytesWaiting(); BOOL DataWaiting(DWORD dwTimeout); //Configuration Methods void GetConfig(COMMCONFIG& config); static void GetDefaultConfig(int nPort, COMMCONFIG& config); void SetConfig(COMMCONFIG& Config); static void SetDefaultConfig(int nPort, COMMCONFIG& config); //Misc RS232 Methods void ClearBreak(); void SetBreak(); void ClearError(DWORD& dwErrors); void GetStatus(COMSTAT& stat); void GetState(DCB& dcb); void SetState(DCB& dcb); void Escape(DWORD dwFunc); void ClearDTR(); void ClearRTS(); void SetDTR(); void SetRTS(); void SetXOFF(); void SetXON(); void GetProperties(COMMPROP& properties); void GetModemStatus(DWORD& dwModemStatus); //Timeouts void SetTimeouts(COMMTIMEOUTS& timeouts); void GetTimeouts(COMMTIMEOUTS& timeouts); void Set0Timeout(); void Set0WriteTimeout(); void Set0ReadTimeout(); //Event Methods void SetMask(DWORD dwMask); void GetMask(DWORD& dwMask); void WaitEvent(DWORD& dwMask); BOOL WaitEvent(DWORD& dwMask, OVERLAPPED& overlapped); //Queue Methods void Flush(); void Purge(DWORD dwFlags); void TerminateOutstandingWrites(); void TerminateOutstandingReads(); void ClearWriteBuffer(); void ClearReadBuffer(); void Setup(DWORD dwInQueue, DWORD dwOutQueue); //Overridables virtual void OnCompletion(DWORD dwErrorCode, DWORD dwCount, LPOVERLAPPED lpOverlapped); protected: HANDLE m_hComm; //Handle to the comms port BOOL m_bOverlapped; //Is the port open in overlapped IO HANDLE m_hEvent; //A event handle we need for internal synchronisation static void WINAPI _OnCompletion(DWORD dwErrorCode, DWORD dwCount, LPOVERLAPPED lpOverlapped); DECLARE_DYNAMIC(CSerial) }; #endif //__SERIAL_H__
-
Es kann natürlich sein dass die GemPlus software den COM blockiert. Ich werde sie deinstalieren und es nochmal testen.
Ja es lag daran, aber es läuft noch nicht ganz wie ich es will. Ich kann die Daten nur einmal an den COM senden, beim zweiten mal ist er blockiert und um erneut zu senden muss ich das prog neustarten.???
-
Also nochmal von vorne.
ich habe das prog von Emperor-LOser vom 12:51:26 31.07.2004 bei mir eingegaut und zur überprüfung ein Nullmodem kabel über COM an einen zweiten rechner gelegt und das prog sendet nicht das was ich in sDaten eingebe.Mit einer anderen methode funzt es einwandfrei, aber sie ist vom code her viel aufwendiger, da ich dort eine datei sende. Ich würde gerne die deten direkt im quellcode eingeben.
Kann mir jemand vielleicht weiterhelfen?
Danke!
-
ich persönlich würde vermuten wollen, das
CSerial serial; serial.Open(1,9600);
zusammen mit
HANDLE hCom; hCom=CreateFile ("\\.\\COM1:",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
nicht funktioniert, da beide Anweisungen ja das selbe tun, nämlich den comport öffnen
-
hat sich erledigt!
hatte nur vergessen den com-port zu schließen...
-
Mach dir nicht soviel Mühe. Microsoft liefert mit Visual C++ ein Active X für den COM Port Zugriff. Leider gut versteckt in der Online Hilfe Name: Communication Control MSCOM.ocx. Im Programmbeispiel VCTREM wird die Anwendung erklärt. Ein erstklassiges OCX das auch für Parallelports funktioniert kannst du unter www.jspayne.com (leider muss man das bezahlen ist aber jeden Cent Wert)herunterladen.
-
Mit der MFC wird ein ActiveX für den Zugriff auf die serielle Schnittstelle mitgeliefert, in der Online Hilfe nach CMSCOMM suchen. Anwendung findet sich im Beispiel VCTREM.
Ein weiteres Control für Schnittstellen (auch Druckerschnittstellen) findet sich unter www.jspayne.com