C++ och serieportskommunikation.

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Användarvisningsbild
toffie
Inlägg: 1922
Blev medlem: 22 juli 2004, 21:38:07
Ort: Töreboda / Stockholm
Kontakt:

C++ och serieportskommunikation.

Inlägg av toffie »

Hallå på er,

Sitter och försöker få fram ett program där jag kan kommunicera mer eller mindre fritt med ex.vis en AVR. Jag har provat ett flertal olika terminalprogram men inget av dem har riktigt det jag känner att jag vill ha. (Fråga inte vad, för jag vet knappt själv ;))

Så jag tänkte mig att jag skulle skriva ihop ett eget och har letat runt för att få lite inspiration. Att tillägga kan jag ju säga att jag har skrivit ett program i Visual Basic .Net som egentligen fungerar precis som jag vill ha det, så jag vill göra detta i C++ både för att utveckla mig själv men även för att kunna delanvända viss kod både i AVR'en och i programmet på datorn.

Visual C++ är det som gäller för mig för detta projekt.

Jag har tagit en del av koden på följande länk för att komma igång och jag har kommit så pass långt att jag tagit bort all "Console" kod eftersom programmet jag vill skapa ska vara "Windows Form" formatet med text-fält osv.
http://msdn.microsoft.com/en-us/library ... lport.aspx

Lägger även in min kod här så ni kan se skillnaden mot ovanstående länk;

Kod: Markera allt

    static void SerialInit()
    {
        String^ name;
        String^ message;
		String^ parity = "None";
        StringComparer^ stringComparer = StringComparer::OrdinalIgnoreCase;
        Thread^ readThread = gcnew Thread(gcnew ThreadStart(PortChat::Read));

        // Create a new SerialPort object with default settings.
        _serialPort = gcnew SerialPort();

        // Allow the user to set the appropriate properties.
        _serialPort->PortName = "COM7";
        _serialPort->BaudRate = 9600;
        _serialPort->Parity = System::IO::Ports::Parity::None;
        _serialPort->DataBits = 8;
        _serialPort->StopBits = System::IO::Ports::StopBits::One;
        _serialPort->Handshake = System::IO::Ports::Handshake::None;

        // Set the read/write timeouts
        _serialPort->ReadTimeout = 500;
        _serialPort->WriteTimeout = 500;

        _serialPort->Open();
        _continue = true;
        readThread->Start();

		/*
        while (_continue)
        {
            message = Console::ReadLine();

            if (stringComparer->Equals("quit", message))
            {
                _continue = false;
            }
            else
            {
                _serialPort->WriteLine(
                    String::Format("<{0}>: {1}", name, message) );
            }
        }*/

       // readThread->Join();
       // _serialPort->Close();
    }
Det jag har fastnat på här är att när man kör med konsollen så kan man ju ha en loop som hela tiden ligger och lyssnar på kommunikation från porten samtidigt som den hinner med att läsa av konsollen och skicka iväg information som man vill skicka ut på porten, men när man vill ändra om det till en form-applikation och har kvar loopen.. Eller rättare sagt, behöver nog lägga till lite mer info för er..

Så som programmet startar just nu, och det är för att jag inte förstått om man kan eller hur man gör för att kalla på ett "namespace" inifrån ett annat "namespace", så just nu startas serieportskommunikationen först därefter laddas form-delen av programmet, dvs det grafiska.

Men om jag då har kvar loopen i koden ovan, så fastnar ju programmet i lyssna delen innan den grafiska biten laddas, vilket gör att man aldrig kommer kunna se själva programmet.

Hur ska man göra och överhuvudtaget tänka i ett sånt här läge? Jag förstår ju givetvis att man behöver någon sorts loop, möjligen kanske något interrupt? för att se om det finns ny data från porten att skriva ut i programmet. Men den "loopen" får ju inte ta över programmet, för då blir det väl så att det låser sig och inte kommer gå att kontrollera?


Så jag förmodar att jag har två frågor här, 1) går det att anropa ett namespace inifrån ett annat namespace, alternativt anropa en class utanför ett namespace som nu denna "PortChat" kod egentligen är.

2) Andra frågan är hur man ska lösa att få in data från porten samtidigt som programmet går att kontrollera i övrigt.
sodjan
EF Sponsor
Inlägg: 43289
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: C++ och serieportskommunikation.

Inlägg av sodjan »

Finns det inte läsanrop som inte väntar utan returnerar direkt "utan data"?

Lite snabb googling gav :
http://msdn.microsoft.com/en-us/library ... dline.aspx
By default, the ReadLine method will block until a line is received. If this behavior is undesirable,
set the ReadTimeout property to any non-zero value to force the ReadLine method to throw
a TimeoutException if a line is not available on the port.
http://msdn.microsoft.com/en-us/library ... meout.aspx
Användarvisningsbild
toffie
Inlägg: 1922
Blev medlem: 22 juli 2004, 21:38:07
Ort: Töreboda / Stockholm
Kontakt:

Re: C++ och serieportskommunikation.

Inlägg av toffie »

Underbart! Allt fanns ju på msdn också tydligen, men jag har väl inte riktigt koll på vad jag skulle leta efter förmodar jag ;)
Många tack, ska läsa igenom och se vad jag lyckas med :)
Skriv svar