RS232 Chat - 13. Klasse Projektvorstellungen



  • Hallo, ich geh in die 13 Klasse und habe Technikwissenschaften als Leistungskurs.
    Wir haben eine Klasse bekommen die Serial.h heißt und die Datenkommunikation zwischen zwei DEEs über ein NULLMODEMKABEL steuern.
    Aufgabe: Schreiben sie ein Programm welches Kommunikation über die RS232 Schnittstelle beschreibt.

    Meine Idee war es nun einfach einen Chat zu erstellen, ich dachte ich würde dafür einige Tage brauchen bin aber nun in einer halben Stunde fertig geworden 😕

    Der Chat kann:
    - Den Namen des Partners weitergeben und diesen wenn er Daten übermittelt anzeigen.
    -Das Datum und Uhrzeit vor der eigenen Nachricht und der des Partners anzeigen
    -Im VOLLDUPLEXMODUS Daten senden und empfangen (wie in MSN)
    -Ein RING( wie in MSN) senden cout<<"\a\a\a\a"
    -Das Programm schließen und damit auch das Programm des Partners schließen

    Nun reicht mir das irgendwie an Komplexibilität als LK'ler nicht aus, es sind gerade mal 80 Lines of Code und wie gesagt nach 30 Minuten war ich Fertig, zwei Wochen haben wir Zeit.

    Hat jemand noch einiges an Kritik und weitere Vorschläge zu äußern?

    Wäre sehr hilfreich, vielen Dank 🙂



  • Verpack dein Chat in eine GUI und schreib ein Protokol noch für den Chat.



  • Also eine GUI zu programmieren traue ich mich nicht, da ich noch nie damit gearbeitet habe, aber ein Protokoll wäre ansich eine ganz gute Sache, Danke.



  • Du kannst doch Qt benutzten das is platformunabhängig un leicht .



  • Qt?



  • http://de.wikipedia.org/wiki/Qt_(Bibliothek)

    Qt ist eine C++-Klassenbibliothek für die plattformübergreifende Programmierung grafischer Benutzeroberflächen. Neben der Entwicklung grafischer Benutzeroberflächen bietet Qt umfangreiche Funktionen zur Internationalisierung sowie Datenbankfunktionen und XML-Unterstützung an und ist für verschiedene Betriebssysteme bzw. Grafikplattformen, wie X11 (Unix-Derivate), Mac OS X, Windows und als PDA-Version erhältlich. Qt wird insbesondere in den Bibliotheken der KDE Software Compilation 4 verwendet, welche gleichzeitig das prominenteste Vorzeigebeispiel der Klassenbibliothek darstellt.



  • gamebuntu schrieb:

    Verpack dein Chat in eine GUI

    Schlechte Idee. Davon rate ich dir (noch) ab.

    Du könntest noch Sachen wie Dateiübertragung ("SEND path/filename", "GET remote_path/filename") hinzufügen, aber irgendwann ist es ausgereizt.

    Der nächste Schritt wäre selbständig ein neues Projekt anzufangen. Nicht zu gross. Damit lernt man am meisten.

    Wenn du Lust auf Kritik hast, kannst du auch die 80 Zeilen Code hier posten.



  • Sehr gerne =3

    #include "Serial.h"
    #include <conio.h>
    #include <iostream>
    #include <ctime>
    #include <stdio.h>
    
    int main()
    {
    
    	const int ACK = 0x06;
    	const int ETX = 0x03;
    
    	time_t t;
    
    	string text = "";
    	string name_me = "Me";
    	string name_partner = "Opposite";
    
    	Serial* SP = new Serial("COM1", 9600, 8, NOPARITY, ONESTOPBIT);
    
    	if (SP->open()==true)
    	{
    		cout << "============================================================"<<endl<<endl;
    		cout <<        "RS232 Chat v1.0 - Please enter your name >";
    		getline(cin,name_me);
    		cout << endl;
    		cout << "============================================================"<<endl<<endl;
    		SP->write(name_me);
    		if ( SP->dataAvailable() )
    		{
    		name_partner = SP->readLine();
    		}
    
    		while ( text != "Exit" && text != "exit" && text != "EXIT" )
    		{
    			if ( SP->dataAvailable() )
    			{
    				text = SP->readLine();
    				time(&t);
    				cout << ctime(&t) <<name_partner<<"> " << text << endl;
    			}
    			else
    			{				
    			while (_kbhit())
    			{
    			time(&t);
    			cout << ctime(&t) << name_me << " >";
    			getline(cin,text);
    			if(text=="Ring" || text=="ring" || text=="RING")
    			{
    				SP->write("Sie haben ein Ring erhalten!\a\a\a\a\a\a\a\a\n");
    				cout<< name_me << " >"<<("Sie haben ein Ring gesendet!\a\a\a\a\a\a\a\a\n\n");
    			}
    			else
    			{
    			cout<<endl;
    			SP->write(text + "\n");
    			}
    			}
    			} 
    		}
    	}
    	else
    	{
    		cout << "Port " << SP->get_portName() << " nicht betriebsbereit"; 
    	}
    
    	SP->write("Exit");
    	cout << endl << "Port "<< SP->get_portName() << " wird geschlossen"; 
    	SP->close();
    	cout << endl <<"Chat wird geschlossen";
    	Sleep(600);
    	cout << ".";
    	Sleep(600);
    	cout << ".";
    	Sleep(600);
    	cout << ".";
    	Sleep(600);
    	return (0);
    }
    


  • 1. Warum allozierst Du das Serial Objekt mit new? Warum nicht als automatisches Objekt?
    2. Wenn schon mit new - wo ist das delete?

    [EDIT]
    3. Variablen sind so kurz wie möglich vor dem Gebrauch zu definieren.



  • cout << endl <<"Chat wird geschlossen";
        Sleep(600);
        cout << ".";
        Sleep(600);
        cout << ".";
        Sleep(600);
        cout << ".";
        Sleep(600);
    

    😃



  • Ich hab's mal kurz umgeschrieben.

    #include "Serial.h"
    #include <conio.h>
    #include <iostream>
    #include <ctime>
    #include <cstdio> // stdio.h ist veraltet, unter C++ nimmt mann cstdio
    
    using namespace std; // Wenn du das noch nicht kennst, ignoriere meine Änderung
                         // Das muss fast in Serial.h stehen und in einem Header
                         // Namensräume einzubinden ist schlechter Stil.
    
    int main()
    {
        const int ACK = 0x06; // Konstanten zu definieren finde ich eine super Idee,
        const int ETX = 0x03; // aber brauchst du die überhaupt?
    
        Serial sp("COM1", 9600, 8, NOPARITY, ONESTOPBIT); // warum new?
    
        if (sp.open()) // nie ==true (oder ==false), das enttarnt dich als Anfänger
        {
            cout << "============================================================\n\n" // endl nicht nötig, \n reicht
                 <<        "RS232 Chat v1.0 - Please enter your name >" << flush;
            string name_me; // Variablen so lokal wie möglich (kurz vor Einsatzort, siehe theta)
            getline(cin, name_me);
            cout << "\n============================================================\n\n";
            sp.write(name_me);
            string name_partner = "Opposite";
            if (sp.dataAvailable()) // Frage: müsste man nicht warten, bis der Name verfügbar ist?
            {
                name_partner = sp.readLine();
            }
    
            string text;
            do // ich war so frei, es in eine do-while-Schleife umzuändern
            {
                if (sp.dataAvailable())
                {
                    text = sp.readLine();
                    time_t t;
                    time(&t);
                    cout << ctime(&t) << name_partner << "> " << text << endl;
                }
                else
                {               
                    while (_kbhit())
                    {
                        time_t t;
                        time(&t);
                        cout << ctime(&t) << name_me << " >";
                        getline(cin, text);
                        if (text == "Ring" || text == "ring" || text == "RING")
                        {
                            sp.write("Sie haben ein Ring erhalten!\a\a\a\a\a\a\a\a\n");
                            cout << name_me << " > Sie haben ein Ring gesendet!\a\a\a\a\a\a\a\a\n\n";
                        }
                        else
                        {
                            cout << endl;
                            sp.write(text + "\n");
                        }
                    }
                }
            } while (text != "Exit" && text != "exit" && text != "EXIT");
        }
        else
        {
            cout << "Port " << sp.get_portName() << " nicht betriebsbereit";
        }
    
        sp.write("Exit"); // Frage 2: Hast du nicht schon oben "Exit" gesendet?
        cout << "\nPort "<< sp.get_portName() << " wird geschlossen";
        sp.close();
        cout << "\nChat wird geschlossen";
        for (int i=0; i<3; ++i) { // Nicht unbedingt nötig, aber so ist es schöner
            Sleep(600);
            cout << "." << flush;
        }
        Sleep(600);
        return 0; // Klammern unnötig
    }
    

    Ich gebe zu, hier wirkt es gekünstelt, aber du könntest Teile des Codes in eigene Funktionen auslagern. Zum Beispiel ein compare_string_case_insensitive.



  • cosenol schrieb:

    Ich hab's mal kurz umgeschrieben.
    Zum Beispiel ein compare_string_case_insensitive.

    oder ein vergleich über ein std:upper?



  • Ring und Exit kann man auch so vergleichen:

    #include <string.h>
    #include <string>
    
    void uppercase( std::string &str)
    {
        for( uint8_t i; i <= str.size(); i++)
        {
            str[i] = toupper(str[i]);
        }
    }
    
    uppercase(text);
    if( text == "EXIT")
    {
    }
    


  • 314159265358979 schrieb:

    cout << endl <<"Chat wird geschlossen";
        Sleep(600);
        cout << ".";
        Sleep(600);
        cout << ".";
        Sleep(600);
        cout << ".";
        Sleep(600);
    

    😃

    Kann mir eigentlich irgendjemand mal erklären, warum insbesondere Anfänger auf die Idee kommen, mithilfe künstlicher Sleep-Anweisungen eine rege Programmaktivität vorgaukeln zu müssen 🙄 ? Zumal in 99% der Fälle sie selbst es sind, die das Programm entwickeln/testen/sehen.



  • Durchschauer schrieb:

    Kann mir eigentlich irgendjemand mal erklären, warum insbesondere Anfänger auf die Idee kommen, mithilfe künstlicher Sleep-Anweisungen eine rege Programmaktivität vorgaukeln zu müssen 🙄 ?

    Hat weniger mit dem Anfänger an sich zu tun. Soll halt "cool" aussehen/rüberkommen, da merkt man, dass mit Liebe programmiert wird 😋 👍



  • gamebuntu schrieb:

    void uppercase( std::string &str)
    {
        for( uint8_t i; i <= str.size(); i++)
        {
            str[i] = toupper(str[i]);
        }
    }
    

    Gibt von mir ein 👎



  • Ok man sollte es vielleicht lieber so machen :

    #include <string>
    #include <cstring>
    #include <cstdint>
    
    bool equalIgnore( string str1, string str2)
    {
    
        if( str1.size() == str2.size())
        {
    
            for( uint8_t i=0; i <= str1.size() ; i++ )
            {
    
                if( toupper( str1[i]) != toupper( str2[i]) )
                {
                    return false;
                }
    
            }
    
            return true;
    
        }else
        {
            return false;
        }
    }
    

Anmelden zum Antworten