Avatar billede cooraz Nybegynder
20. april 2010 - 16:45 Der er 29 kommentarer og
1 løsning

serialport i en class (visual c++)

jeg har indtil videre lavet flg:

void eyeR::connect(void)
{
    SerialPort^ eyeR_sp = gcnew SerialPort();
    if(eyeR_sp->IsOpen == true) { eyeR_sp->Close(); } // tjekker om porten allerede er åben og lukker den hvis det er tilfældet
    eyeR_sp->PortName = "COM6";
    eyeR_sp->BaudRate = 57600;
    eyeR_sp->DataBits = 8;
    eyeR_sp->Open();
}
void eyeR::disconnect()
{
}
void eyeR::write_servo_new_def(int servo_number, int min_raw_value, int max_raw_value, int index_num, int initial_index )
{
}

men hvordan får jeg kaldt eyeR_sp i den andre funktioner i classen så jeg kan skrive til porten osv...?
Avatar billede arne_v Ekspert
20. april 2010 - 16:51 #1
eyeR_sp skal vel aedres fra lokal variabel til et field i klassen?
Avatar billede cooraz Nybegynder
20. april 2010 - 16:55 #2
hvordan gør man det?
Avatar billede arne_v Ekspert
20. april 2010 - 17:05 #3
ref class B
{
    private:
        A^ a;
    public:
        // metoder
};

Nu kan a bruges i alle metoder.
Avatar billede cooraz Nybegynder
20. april 2010 - 17:16 #4
jeg tror nok det næsten er magen til det jeg har.. jeg har bare delt det op i 2 filer... en header og en cpp fil...

Header:
ref class eyeR
{
public:
    static void connect(void);
    void disconnect(void);
    void write_servo_new_def(int, int, int, int, int);

};



cpp-fil:
#include "stdafx.h"
#include "classes.h"

using namespace System::IO::Ports;

void eyeR::connect(void)
{
    SerialPort^ eyeR_sp = gcnew SerialPort();
    if(eyeR_sp->IsOpen == true) { eyeR_sp->Close(); } // tjekker om porten allerede er åben og lukker den hvis det er tilfældet
    eyeR_sp->PortName = "COM6";
    eyeR_sp->BaudRate = 57600;
    eyeR_sp->DataBits = 8;
    eyeR_sp->Open();
}
void eyeR::disconnect()
{
}
void eyeR::write_servo_new_def(int servo_number, int min_raw_value, int max_raw_value, int index_num, int initial_index )
{
}


burde det ikke lave alle funktionerne public?

for det hjælper ihvertfald ikke
Avatar billede arne_v Ekspert
20. april 2010 - 17:35 #5
Header:
ref class eyeR
{
private:
    SerialPort^ eyeR_sp;
public:
    static void connect(void);
    void disconnect(void);
    void write_servo_new_def(int, int, int, int, int);

};



cpp-fil:
#include "stdafx.h"
#include "classes.h"

using namespace System::IO::Ports;

void eyeR::connect(void)
{
    eyeR_sp = gcnew SerialPort();
    if(eyeR_sp->IsOpen == true) { eyeR_sp->Close(); } // tjekker om porten allerede er åben og lukker den hvis det er tilfældet
    eyeR_sp->PortName = "COM6";
    eyeR_sp->BaudRate = 57600;
    eyeR_sp->DataBits = 8;
    eyeR_sp->Open();
}
void eyeR::disconnect()
{
}
void eyeR::write_servo_new_def(int servo_number, int min_raw_value, int max_raw_value, int index_num, int initial_index )
{
}
Avatar billede cooraz Nybegynder
20. april 2010 - 17:53 #6
det giver en masse fejl
hvis jeg så tilføjer namespace't i headerfilen:
using namespace System::IO::Ports;

så kommer der bare nogle andre fejl:
1>.\classes.cpp(8) : error C2597: illegal reference to non-static member 'eyeR::eyeR_sp'
1>.\classes.cpp(9) : error C2227: left of '->IsOpen' must point to class/struct/union/generic type
1>.\classes.cpp(9) : error C2227: left of '->Close' must point to class/struct/union/generic type
1>.\classes.cpp(10) : error C2227: left of '->PortName' must point to class/struct/union/generic type
1>.\classes.cpp(11) : error C2227: left of '->BaudRate' must point to class/struct/union/generic type
1>.\classes.cpp(12) : error C2227: left of '->DataBits' must point to class/struct/union/generic type
1>.\classes.cpp(13) : error C2227: left of '->Open' must point to class/struct/union/generic type
Avatar billede arne_v Ekspert
20. april 2010 - 18:34 #7
Kan du poste begge filerne komplette?

Jeg tror at det er en ganske lille ting der skal rettes.
Avatar billede cooraz Nybegynder
20. april 2010 - 20:10 #8
det er de komplette filer... jeg inkluder bare header filen i min windows form header og bruger den der
Avatar billede arne_v Ekspert
21. april 2010 - 03:53 #9
Det virker med de rette using og hvis connect laves ikke-static.

#using <mscorlib.dll>

using namespace System::IO::Ports;

ref class eyeR
{
private:
    SerialPort^ eyeR_sp;
public:
    void connect(void);
    void disconnect(void);
    void write_servo_new_def(int, int, int, int, int);

};

#using <mscorlib.dll>
#using <system.dll>

using namespace System::IO::Ports;

#include "foobar.h"

using namespace System::IO::Ports;

void eyeR::connect(void)
{
    eyeR_sp = gcnew SerialPort();
    if(eyeR_sp->IsOpen == true) { eyeR_sp->Close(); } // tjekker om porten allerede er åben og lukker den hvis det er tilfældet
    eyeR_sp->PortName = "COM6";
    eyeR_sp->BaudRate = 57600;
    eyeR_sp->DataBits = 8;
    eyeR_sp->Open();
}

void eyeR::disconnect()
{
}

void eyeR::write_servo_new_def(int servo_number, int min_raw_value, int max_raw_value, int index_num, int initial_index )
{
}
Avatar billede cooraz Nybegynder
21. april 2010 - 08:35 #10
så giver den fejl i min form1.h fil istedet...

den siger:
1>c:\users\bjarne\documents\visual studio 2008\projects\eyer windows\eyer windows\Form1.h(390) : error C2352: 'eyeR::connect' : illegal call of non-static member function
1>        c:\users\bjarne\documents\visual studio 2008\projects\eyer windows\eyer windows\classes.h(10) : see declaration of 'eyeR::connect'

og det er lige meget om jeg har using af de 2 dll filer med, det giver samme fejl med og uden de usings

i form1.h står der:
private: System::Void connectToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
            eyeR::connect(); //connect til eyeR

        }
Avatar billede segmose Nybegynder
21. april 2010 - 10:40 #11
Problemet må være her:

eyeR::connect(); //connect til eyeR

eyeR er en class men skulle være en instance.
Avatar billede cooraz Nybegynder
21. april 2010 - 11:36 #12
hjælper ikke.

hvis jeg tilføjer:
eyeR hej();
hej.connect();

skriver den bare:
1>c:\users\bjarne\documents\visual studio 2008\projects\eyer windows\eyer windows\Form1.h(392) : error C2228: left of '.connect' must have class/struct/union
Avatar billede arne_v Ekspert
21. april 2010 - 16:44 #13
Den kode jeg postede i #9 compiler fint.

At det muligvis giver fejl i noget andet kode som du ikke har vist eller forklaret om er svaert at forhindre.

Ja. Med den aendring kraver det en instans af klassen.

Du skal sikre dig at Form1.h inkluderer .h filen der definerer klassen.

Og proev saa med:

eyeR^ hej = gccnew eyeR();
hej->connect();
Avatar billede cooraz Nybegynder
21. april 2010 - 17:21 #14
jeg har en include i toppen af form1.h så det skulle være i orden
men det melder stadig fejl hvis jeg bruger gcnew... så sker der bare dette:

1>c:\users\bjarne\documents\visual studio 2008\projects\eyer windows\eyer windows\Form1.h(17) : error C2072: 'eyeRwindows::hej' : initialization of a function
1>c:\users\bjarne\documents\visual studio 2008\projects\eyer windows\eyer windows\Form1.h(17) : error C2440: 'initializing' : cannot convert from 'eyeR ^' to 'eyeR ^(void)'
Avatar billede arne_v Ekspert
21. april 2010 - 17:28 #15
Hvordan ser den relevante kode i Form1.h ud nu?
Avatar billede cooraz Nybegynder
21. april 2010 - 18:20 #16
der er faktisk ikke den store kode i filen

det er bare en form hvor der er lavet nogle knapper og en progress bar men der er ikke tilføjet nogen funktioner til dem endnu...

har så en knap (toolstrip) der hedder connect som skal kalde connect kommandoen

eyeR^ hej = gccnew eyeR(); og den her linje har jeg smidt helt oppe for oven hvor alle de andre using namespace xx er...
Avatar billede arne_v Ekspert
22. april 2010 - 01:59 #17
eyeR^ hej = gccnew eyeR();

skal være i koden hvor du skal bruge et eyeR objekt. Ikke oppe mellem using.
Avatar billede cooraz Nybegynder
22. april 2010 - 10:55 #18
hvis jeg smider dem samme sted giver den bare 3 fejl istedet:

1>c:\users\bjarne\documents\visual studio 2008\projects\eyer windows\eyer windows\Form1.h(98) : error C2072: 'hej' : initialization of a function
1>c:\users\bjarne\documents\visual studio 2008\projects\eyer windows\eyer windows\Form1.h(98) : error C2205: 'hej' : cannot initialize extern variables with block scope
1>c:\users\bjarne\documents\visual studio 2008\projects\eyer windows\eyer windows\Form1.h(98) : error C2440: 'initializing' : cannot convert from 'eyeR ^' to 'eyeR ^(void)'

btw det skal vel være gcnew og ikke gccnew?
Avatar billede cooraz Nybegynder
22. april 2010 - 13:14 #19
nu fik jeg det til at virke...

det var mig der havde kopieret linjen og glemt at slette den for oven...

men vil det sige at jeg skal lave en ny instance af class'en hver gang jeg skal bruge den et nyt sted?
Avatar billede arne_v Ekspert
23. april 2010 - 02:06 #20
Ja. gccnew var en skrivefejl.
Avatar billede arne_v Ekspert
23. april 2010 - 02:08 #21
Du skal lave en ny instans af klassen hver gang du skal bruge en.

Måske opretter du en ny i hver Form1 metoder der skal bruge den.

Måske opretter du eb i Form1 constructor og bruger den samme i alle metoder.

Det afhænger af hvilken funktionalitet/logik du har brug for.
Avatar billede segmose Nybegynder
23. april 2010 - 11:07 #22
Hej
  Jeg tror du skal læne dig tilbage og overveje hvad det er din funktion skal gør.
  Hvis der kun skal være en instance af classen så kan du bruge den samme instance over det hele hvis den er defineret det rigtige sted, hvis der er noget der skal gælde for alle instances af classen kan du lave noget static function.
  Sandsynligvis skal du bare oprette en instance mm. du bruger forskellige methoder med forskellige parameter, hvilket din origanale post ikke antyder.
Avatar billede cooraz Nybegynder
23. april 2010 - 16:05 #23
har forsøgt at oprette den i contructoren for form1 men så kan den ikke findes der hvor jeg skal bruge den

jeg har kun brug for en instance af classen men den skal bare bruges mange steder i form1
Avatar billede arne_v Ekspert
23. april 2010 - 16:13 #24
Har du lavet det som et felt i klassen som bliver initaliseret i constructor?
Avatar billede cooraz Nybegynder
23. april 2010 - 21:15 #25
er ikke sikker på jeg forstår hvad du mener men har prøvet på ldit forskellige måder... lige nu står det sådan her:
    public:
        Form1(void)
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            eyeR^ hej = gcnew eyeR();
            //
           
        }

det giver ingen fejl men kan heller ikke bruge den... de andre ting jeg har prøvet meldt alt sammen fejl
Avatar billede arne_v Ekspert
23. april 2010 - 21:21 #26
private:
        eyeR^ hej;
public:
        Form1(void)
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            hej = gcnew eyeR();
            //
         
        }
Avatar billede cooraz Nybegynder
23. april 2010 - 22:40 #27
hmm ja så virker det... hvorfor er det at den skal stå i private for at det virker?
Avatar billede arne_v Ekspert
24. april 2010 - 00:11 #28
Det afgoerende er at det kommer ud som felt i klassen fremfor at vaere lokal variabel.

At den er i private fremfor public er kun en detalje - jeg valgte det fordi det er god skik og brug.
Avatar billede cooraz Nybegynder
24. april 2010 - 08:43 #29
okay tak for hjælpen
smider du et svar så får du point..
Avatar billede arne_v Ekspert
24. april 2010 - 13:45 #30
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester