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

læse fra en serial port + bøger om emnet (c++)

hvordan får jeg mit program til at læse fra en serial port jeg har oprettet forbindelse til?

indtil videre ser mit program sådan ud:

#include "stdafx.h"

using namespace System;
using namespace System::IO::Ports;

int main()
{
    //initialiser eyeR
    SerialPort^ eyeR = gcnew SerialPort();
    if(eyeR->IsOpen == true) { eyeR->Close(); }
    eyeR->PortName = "COM6";
    eyeR->BaudRate = 57600;
    eyeR->DataBits = 8;
    eyeR->Open();
   
    eyeR->Write(">S1 S 060 240 010 008\r"); //skriver til eyeR init command til servo
   
    eyeR->DataReceived += gcnew SerialDataReceivedEventHandler(eyeR_datareceive);

    Console::WriteLine(L"Hello World");
    return 0;

}

jeg kan fint skrive til eyeR men hvordan jeg laver den eventhandler har jeg ikke den store idé om...

eyeR fungerer sådan at den sender data via usb porten (COM6) hver gang der er noget der ændrer sig (enten hvis jeg ændrer noget ved at skrive til den, eller hvis der er en værdi der ændrer sig selv)

derfor ville det vel også være det bedste med en eventhandler eller hvad?


evt nogen som kender navnet på nogle gode bøger omkring emnet... umiddelbart jeg ikke ikke lige kunne finde nogle som ordentligt går ind og fortæller om kommunikation med serial/usb port..
Avatar billede arne_v Ekspert
16. april 2010 - 16:28 #1
Du skal lave en eyeR_datareceive metode med den rette signatur, saa bliver den kaldt naar data modtages.
Avatar billede arne_v Ekspert
16. april 2010 - 16:32 #2
Der er nok ikke mange C++ eksempler derude. Men find et C# eksempel og oversaet til C++.
Avatar billede cooraz Nybegynder
16. april 2010 - 16:42 #3
http://www.amazon.com/gp/product/1430210230?ie=UTF8&tag=msdn-c-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=1430210230
er den her bog noget værd?

ja problemet er bare at få lavet den eyeR_datareceive...

jeg har prøvet med bare at skrive:
void eyeR_datareceive(object^ sender, SerialDataReceivedEventArgs^ e)
{
}

men så giver den en masse fejl:

1>.\eye.cpp(8) : error C2065: 'object' : undeclared identifier
1>.\eye.cpp(8) : error C2065: 'sender' : undeclared identifier
1>.\eye.cpp(8) : error C2065: 'e' : undeclared identifier
1>.\eye.cpp(8) : error C2275: 'System::IO::Ports::SerialDataReceivedEventArgs' : illegal use of this type as an expression
1>        c:\windows\microsoft.net\framework\v2.0.50727\system.dll : see declaration of 'System::IO::Ports::SerialDataReceivedEventArgs'
1>.\eye.cpp(9) : error C2448: 'eyeR_datareceive' : function-style initializer appears to be a function definition
1>.\eye.cpp(24) : error C2065: 'eyeR_datareceive' : undeclared identifier
1>.\eye.cpp(24) : error C3350: 'System::IO::Ports::SerialDataReceivedEventHandler' : a delegate constructor expects 2 argument(s)
Avatar billede arne_v Ekspert
16. april 2010 - 16:49 #4
Jeg tror at object skal vaere Object.
Avatar billede arne_v Ekspert
16. april 2010 - 16:51 #5
Der er nok andre syntax problemer.

Check:

http://www.functionx.com/vccli/general/events.htm

for tips omkring event handler syntax.
Avatar billede cooraz Nybegynder
16. april 2010 - 17:00 #6
det har du da også fuldstændig ret i ang det object...

tak for linket

nu fik jeg den til vidst til at fungere, jeg kan ihvertfald få den til at skrive at der er kommet data

tak for hjælpen

smid et svar så får du point
Avatar billede arne_v Ekspert
16. april 2010 - 17:17 #7
svar
Avatar billede arne_v Ekspert
16. april 2010 - 17:17 #8
SerialDataReceivedEventArgs^ e

maa indeholde den information du skal bruge
Avatar billede cooraz Nybegynder
16. april 2010 - 17:49 #9
hmm ja kan ikke lige få den til at skrive de data der kommer fra porten, men det finder jeg nok ud af..
Avatar billede arne_v Ekspert
16. april 2010 - 18:02 #10
Nu har jeg lige laest docs paa den event.

Tilsyneladende fortaeller den kun at data er ankommet.

Dat kan saa laeses via SerialPort klassens Read metode (propertyen BytesToRead fortaeller hvor meget der er at laese).
Avatar billede cooraz Nybegynder
16. april 2010 - 19:19 #11
ja det fandt jeg også ud af men kan ikke få lov til at kalde eyeR-> inde i eventen
Avatar billede arne_v Ekspert
16. april 2010 - 19:22 #12
Hvad med:

((SerialPort^)sender)->blabla
Avatar billede cooraz Nybegynder
16. april 2010 - 20:28 #13
jow det ser ud til at virke...
men skal sådan en læses byte for byte i en while løkke?

for har prøvet uden en while løkke men så skriver den bare System.Byte[]


    int bytecount = ((SerialPort^)sender)->BytesToRead;
    array<Byte>^ bytearray = gcnew array<Byte>(500);

    Console::WriteLine(bytecount);

    ((SerialPort^)sender)->Read(bytearray,0,bytecount);
    Console::WriteLine(bytearray->ToString());

    Thread::Sleep(5500);
Avatar billede arne_v Ekspert
16. april 2010 - 20:33 #14
proev:

Console::WriteLine(Encoding::UTF8->GetString(bytearray));

Du skal have using System::Text med.
Avatar billede arne_v Ekspert
16. april 2010 - 20:34 #15
skal

array<Byte>^ bytearray = gcnew array<Byte>(500);

ikke vaere:

array<Byte>^ bytearray = gcnew array<Byte>(bytecount);

?
Avatar billede cooraz Nybegynder
16. april 2010 - 21:05 #16
jow det virker! mange tak for hjælpen...

jow det var bare lige til test at jeg satte size til 500 :)
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