serielle schnittstelle und c++



  • @chris`: Entschuldige bitte meine nervige Antwort. Deine Frage war ungenau, da hätte so ziemlich alles gepaßt.

    Altes DOS-Prog in W2K:
    Öffnen der Ser. Schnittstellen mit CreateFile (...)
    Schreiben mit WriteFile (...)
    Lesen mit ReadFile (...)
    Schließen mit CloseHandle (...).
    Weiter nützlich Funktionen:
    Setzen der Ausgänge mit EscapeCommFunction (...)
    Status der Eingänge abfragen mit WaitCommEvent (...) und SetComMask (...)
    Setzen der Porteigenschaften mit SetCommState (...)
    Abfragen der Porteigenschaften mit GetCommState (...)
    ...

    Was Du davon verwendest hängt ganz davon ab, was Du mit der Schnittstelle veranstalten willst. Soll sie unabhängig voneinander (ohne sich kurzzeitig zu blockieren) empfangen und senden können? Soll die ganze serielle Kommunikation im Hintergrund laufen? Nur senden oder nur empfangen?

    Wie Du siehst, ist ohne eine genauere Beschreibung noch nicht viel mehr möglich. Oder Du nimmst Dir Google und suchst nach Beispielcode, den Du dann anpassen mußt (oder auch nicht?).

    Blackbird



  • Artchi schrieb:

    Wer eine serielle Schnittstelle ansteuern will, wird in der Std-Lib nicht fündig.

    Meiner Meinung nach gehören aber solche Dinge in den nächsten definierten Standard mit rein (also als StdLib-Teil meine ich).

    Meiner Meinung nach nicht, denn nicht alle Plattformen, auf denen C++ eingesetzt werden kann, verfügen über eine serielle Schnittstelle. Da kann man gleich ein Interface zum Windows-Online-Update im Standard festhalten 🙄 .



  • aber alle verfügen über hardware ports mit denen man auch die serielle schnittstelle ansprechen kann. also müsste es doch eigentlich gehn ne?



  • muhkuhmasta schrieb:

    aber alle verfügen über hardware ports mit denen man auch die serielle schnittstelle ansprechen kann. also müsste es doch eigentlich gehn ne?

    zm einen: wirklich alle?(muss ich mich kundig machen)
    zum zweiten: was für ein aufwand..
    zum dritten: und wo bleibt die von stroustrup geforderte "schlankheit" des standards?



  • auf jeden fall alle ibm kompatiblen.

    kein größerer aufwand als unter dos, wenn man das alles hübsch kapselt

    besser ein fetter standard als os abhängige routinen würd ich mal sagen



  • anderer meinung 😉



  • Naja, selbst mein alter C64 hatte einen parallelen Port und eine serielle Schnittstelle. Und da die Library ja generig sein müsste, würde es selbst auf dem C64 laufen. Und selbst wenn kein Port verfügbar sein sollte, könnte man sich da was überlegen. Z.B. das eine Exception geworfen wird. Denn ganz ehrlich, wer sagt denn, das jede Plattfiorm ein Ausgabe- oder Eingabegerät hat? Oder was passiert, wenn ich auf solchen Systemen cout und cin nutzen will??? Ist doch das selbe Problem wie mit den Ports.



  • Hallo,
    für ANSI-C gibt es einen TR namens "C Extensions to support Embedded Processors"

    Ob das mal Standard wird ist soweit ich weiß aber noch nicht raus.



  • ich habe mir nun die header datei für die serielle schnittstelle besorgt, nur scheine ich es nicht hinzubekommen, diese zu verwenden. muss dazu sagen das ich auf diesem gebiet erst sehr wenig erfahrung habe, berichtigt mich falls ich nen falschen ansatz habe...

    hab jetzt erstmal ein neues objekt erstell:

    CSerial com;
    

    CSerial ist ja die Klasse für die Schnittstelle...
    Dann sollte doch eigentlich über

    com.Open(1,19600,8,NULL,0);
    

    die Schnittstelle mit den Parametern für Baud usw geöffnet werden und mit

    com.ReadData( buffer);
    

    das Gerät am Port ausgelesen, oder befinde ich mich bei diesem Denken auf dem Holzweg?

    am Port selbst hängt ein Programmiermodul und an diesem eine PM_B Karte



  • hast du in deinem Code:

    #include "headerdatei.h"
    


  • ja



  • hi chris

    frag doch einfach mal im richtigen forum, sprich: bei den mfc könnern (hier im mfc forum).

    außerderm gibts hier eine beispielanwendung, denke ich
    http://www.codeguru.com/Cpp/I-N/network/serialcommunications/article.php/c2503

    zum download.

    so long

    ps: auf mfc komme ich, weil im der zu donwloadenden beispielanwendung
    #include "stdafx.h"
    benötigt wird 😉 also mfc mit einbinden!!



  • habs mal eben durchgetestet: ein projekt anlegen
    win32 konsole, aber MIT mfc unterstützung.

    dann gehts wunderbar mit dem downgeloadeten source.

    so long



  • void CI2c_porgDlg::OnRead()
    {
    	CComboBox * pCB = (CComboBox *) GetDlgItem ( IDC_COM ) ; 
    	int com_no = pCB -> GetCurSel () ;
    	if ( com_no >= 0 )		
    	{
    		pCB -> GetLBText( com_no , iCOM ) ;
    
    CFileDialog sa ( 0,". bin", "i2c", 0, "Bin-Dateien(*.bin)|*.bin||" ) ;
    		if (sa.DoModal() == IDOK)
    		{
    			if (iCOM == "COM1") cport = 1;
    			if (iCOM == "COM2") cport = 2;
    			UpdateData ( TRUE ) ;
    			CString m_sPath = sa.GetPathName( );
    			CFile newbin;
    		    newbin.Open( m_sPath, CFile::modeCreate|CFile::modeWrite);
    			CSerial serial;
    			if (serial.Open(1, 9600))
    				{
    					char* lpBuffer = new char[500];
    					int nBytesRead = serial.ReadData(lpBuffer, 500);
    					char szSampleText[255];
    					strcpy(szSampleText, lpBuffer);
    					newbin.Write (szSampleText,255);
    					delete []lpBuffer;
    				}
    				else
    				AfxMessageBox("Failed to open port!");
    		}
    }	
    	else
    		MessageBox ("Bitte COM-Port wählen!");
    
    }
    

    So sieht mein Programmstück bisher aus, liefert mir aber einen Fehler....

    Debug Assertiation Failed
    Programm:....
    File:filecore.cpp
    Line:237

    😞



  • Hallo,

    in Zeile 237 der filecore.cpp befindet sich das hier:

    ASSERT_VALID(this);
    

    also stimmt irgendetwas mit dem CFile-Objekt newbin nicht, das mußt du prüfen, warum evtl. keine Datei erstellt wurde (dazu z.B. den Rückgabewert von newbin.Open prüfen, oder den Dateinamen ausgeben lassen).

    MfG



  • chris`- schrieb:

    void CI2c_porgDlg::OnRead()
    {
    	CComboBox * pCB = (CComboBox *) GetDlgItem ( IDC_COM ) ; 
    	int com_no = pCB -> GetCurSel () ;
    	if ( com_no >= 0 )		
    	{
    		pCB -> GetLBText( com_no , iCOM ) ;
    		
    
    CFileDialog sa ( 0,". bin", "i2c", 0, "Bin-Dateien(*.bin)|*.bin||" ) ;
    		if (sa.DoModal() == IDOK)
    		{
    			if (iCOM == "COM1") cport = 1;
    			if (iCOM == "COM2") cport = 2;
    			UpdateData ( TRUE ) ;
    			CString m_sPath = sa.GetPathName( );
    			CFile newbin;
    		    newbin.Open( m_sPath, CFile::modeCreate|CFile::modeWrite);
    			CSerial serial;
    			if (serial.Open(1, 9600))
    				{
    					char* lpBuffer = new char[500];
    					int nBytesRead = serial.ReadData(lpBuffer, 500);
    					char szSampleText[255];
    					strcpy(szSampleText, lpBuffer);
    					newbin.Write (szSampleText,255);
    					delete []lpBuffer;
    				}
    				else
    
    				AfxMessageBox("Failed to open port!");
    		}
    }	
    	else
    		MessageBox ("Bitte COM-Port wählen!");
    
    }
    

    So sieht mein Programmstück bisher aus, liefert mir aber einen Fehler....

    Debug Assertiation Failed
    Programm:....
    File:filecore.cpp
    Line:237

    😞

    aber das beispiel, was ich dir da oben zum download angeraten habe, funktioniert doch wohl. hast du dich daran orientiert?
    nochmal: frag doch im richtigen unterforum. ➡ Mfc



  • Danke für die hilfe, problem hat sich gelöst... habe einfach den strcpy befehl rasugenommen und schreibe den puffer direkt in die datei.



  • gibt es eine möglichkeint den buffer der seriellen schnittstelle zu löschen?




Anmelden zum Antworten