RS232 Chat - 13. Klasse Projektvorstellungen



  • 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