serielle Schnittstelle
-
Hallo,
ich habe in der FAQ nen Beitrag zum ansprechen einer seriellen Schnittstelle gefunden. Die ersten Schritte damit sind auch recht einfach. Ich habe es schließlich auch geschaft, dass das Gerät was dort dranhängt das macht, was ich will nur die Daten die ich zurückbekomme hauen irgendwie nicht so ganz hin. Irgendwie kommt bei RS232.Receive(txt,8); nur Müll zurück. Das ganze ist übrigens in einen Dialog eingebunden.void CVersuchSerielleSchnittstelleDlg::OnBnClickedButton4() { // TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die CSERIELL RS232; bool hallo = RS232.Init(1,9600,8,0,0,2,100,1000); char *txt = new char[24]; txt[0]=2; txt[1]='A'; txt[2]=0; txt[3]=0; txt[4]=0; txt[5]=0; txt[6]=0; txt[7]=3; RS232.Send(txt,8); RS232.Receive(txt,8); RS232.Close(); delete[] txt; } 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.fAbortOnError = 1; //Bitte hier die leerzeichen // wegmachen. Vermutlich Bug im Forum SetCommState(this->m_hPort, &dcb); return true; } return false; }
-
ich habe ein bissschen weiter geschaut und die Schnittstelle scheint zwar zu funktionieren allerdings aber mit einem Portviewprogramm bekomme ich folgende Meldung. Vielleicht kann mir einer von Euch weiterhelfen, was das ganze heißt.
IOCTL_SERIAL_WAIT_ON_MASK INVALID PARAMETER
-
eventuell kriegst du beim umschalten deiner peripherie von empfang auf senden etwas datenmüll ab. vielleicht hilft dir auch das hyperterminal beim debuggen