via internet rs232 aansturen

Anoniem

Hallo allemaal,

Op school heb ik een project waarbij je via internet de com poort moet aansturen via het rs232 protocol.
Ik heb een programma geschreven in c++ welke de com poort aanstuurt. Het is nu alleen nog de bedoeling dat ik via het internet dit programma kan opstarten.

Weet iemand hoe ik dit kan doen?

netmeeting of zo, ofwel via iets anders de controle van target pc overnemen

tenzij ut webbased moet zijn

[Bericht gewijzigd door Tim Blanckaert op dinsdag 7 november 2006 21:26:22

Anoniem

Het moet inderdaad webbased zijn.
Ik heb al wel een werkende apache en php lopen op mijn windows xp machine.

Misschien helpt dit?

Als het webbased moet zijn:

In het kort:
* Installeer een apache webserver op je PC, samen met PHP.
* Maak je C++ programma als console programma, dat eventueel met opstartopties kan werken
* Maak een kleine webpagina waar je bv via een formulier de opties kan ingeven; Bij het verzenden van het formulier roept de PHP/Webserver dan de applicatie op, en deze doet dan zijn ding. Eventueel kan je output ervan dan wegschrijven in een textfile, en deze achteraf met PHP terug gaan uitlezen en weergeven op je webpagina.

Sonar is meer dan Ping...
Anoniem

Hoe roept de webserver dan het programma op? doet hij dit automatisch? welke code moet ik anders gebruiken?

Schrijf het in C# een java achtige taal en vrij makkelijk te implementeren.

Daarin zit een serialport object waarmee je de compoort aanstuurt en socket classes waarmee je een luisterende server op kan zetten.

Je kan dan een in PHP een script schrijven die inlogt op je server en er een commando heen stuurt die je erin hebt geproggrameerd. Dit PHP script kan je op iedere webserver die sockets ondersteunt.

Je kan ook een tweede client schrijven in c# die een verbinding op zet naar de luisterende server en commando's verstuurt.

Anoniem

De leraren willen het eigelijk in C++ hebben.

Anoniem

Hoe kan php dan een programma aanroepen? en hoe haalt het programma dan de juiste waardes van php?

code:


string exec ( string command [, array &output [, int &return_var]] )

Dan krijg je zoiets

code:

exec(program.exe Argument1 Argument2, $output)
Anoniem

die eerste code is voor php en de 2de is dus voor mijn programma?

Nee, eerste het de prototype van de functie en de 2de is een voorbeeld zoals je de functie kan gebruiken. Zie ook php.net

Anoniem

Wat moet ik dan invullen bij argument 1 en argument 2?
Als ik dit dan uitvoer opent php het programma. ik neem aan dat het programma dan $output nog moet uitlezen.
Kan ik in het programma gewoon output gebruiken als variabele? of moet ik de variabele $output op een andere manier aanroepen?

Je kunt toch ook rechtstreeks een exe aanroepen via bv Apache. Deze exe moet dan natuurlijk HTML ophoesten ipv gewone console text. Beetje hetzelfde idee als Perl webpages.

Anoniem

Ik heb het tot nu toe zover dat ik een programma kan opstarten welke 8 ledjes aanzet. nu moet ik alleen nog een variabele naar dit programma sturen waarin een hexadecimale code staat. ik kan nu wel een hexadecimale code maken met php maar ik weet nog niet hoe ik deze verwerk in de exec functie.

Ook weet ik niet hoe ik dan in het programma de hexcode ophaal.
iemand enig idee hoe dit werkt?

Een ietwat andere route is een Ethernet-RS232 module. Dan programmeer je tegen een IP-adres danwel een virtuele seriele poort.
Bijvoorbeeld: http://www.antratek.nl/Sollae.html
Prijzen vanaf 33 Euro als ik het goed heb.

Anoniem

Is wel een leuk apparaatje. Maar ik moet dadelijk ook videobeelden versturen en dan heb ik denk ik niet veel meer aan dit apparaatje.
Ik zoek dus meer de oplossing van mijn net gestelde vraag.

bijvoorbeeld zo:

code:


<?
$value = 255 // zet hier het hexadecimale getal in
$prog = "program.exe ".$value
exec($prog)
?>

code:


#include <stdio.h>

void main(int argc, char *argv[])
{
 printf("%d", argv[1]); //in argv[1] staat de waarde van $value
}

edit://
Maar welke opleiding doe je eigenlijk want dit is wel heel basic. Als je op Command line parameters C++ googled en op PHP exec function had je met beide eerste links het al helemaal zelf moeten kunnen uitvinden.

[Bericht gewijzigd door xantus op woensdag 8 november 2006 14:11:45

Anoniem

Ik heb nu de volgende C++ code
Wat klopt er dan niet??

code:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
//#include "Unit1.h"
#include "winbase.h"
#include "windef.h"
#include <windows.h>
#include <stdio.h>
HANDLE    hcom;

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
        DCB dcb;
        DWORD NumberOfBytesWritten;
        //int a,b,c,d,e,f,g,h,i,j,k;
        HANDLE  hcom = CreateFile ("Com1",
                GENERIC_READ|GENERIC_WRITE,
                0,
                0,
                OPEN_EXISTING,
                0,
                0);
        dcb.DCBlength = sizeof(DCB);
        GetCommState(hcom,&dcb);
        dcb.BaudRate = 4800;
        dcb.ByteSize = 8;
        dcb.Parity = NOPARITY;
        dcb.StopBits = ONESTOPBIT;
        SetCommState(hcom, &dcb);
       // SetCommState(




        //a = 0x01;
        //b = 0x02;
        //c = 0x04;
        //d = 0x08;
        //e = 0x10;
        //f = 0x20;
        //g = 0x40;
        //h = 0x80;
        //k = a+b+c+d+e+f+g+h;
        printf("%d", argv[0]); //in argv[0] staat de waarde van $value
        WriteFile(hcom, &argv[0], 1, &NumberOfBytesWritten, NULL);
        Sleep(10);
        CloseHandle(hcom);
        return 0;
}
//---------------------------------------------------------------------------
Anoniem

ook nog even het stukje php wat ik nu dus heb:

code:

<?php
$value = 0x80 // zet hier het hexadecimale getal in
$prog = "Project2.exe ".$value;
exec($prog)
?>

Klein foutje van mijn kant, argv[1] is een string, niet een int.

Als je het niet erg vindt om nog eer *.h files te includen kan je de atoi functie gebruiken om er een int van te maken.

Als je (net als ik) liever zo min mogelijk extra *.h files toevoegd kan je ook zoiets doen:

code:


bool string2int(char* digit, int& result) {
   result = 0;

   while (*digit >= '0' && *digit <='9') {
      result = (result * 10) + (*digit - '0');
      digit++;
   }

   if (*digit != 0) {
      return 0; // there are non-numbers in the string
   }

   return result;
}

dan krijg je zoiets:

code:


#include <iostream.h>

int string2int(char*d,int&r){for(r=0;*d>='0'&&*d<='9';r=r*10+*(d++)-'0');return(*d==0)?r:0;}

void main(int argc, char*argv[]){
int r;
cout<<string2int(argv[1], r);
}

Maar gebruik dat alleen als je weet hoe het werkt.

Heb verder je COM poort aansturing niet getest, neem aan dat die goed werkt

Anoniem

De com poort aansturing werkt volgends mij. deze heb ik getest.

Nu snap ik alleen niet welk deel ik in mijn code moet plakken. de eerst of de 2de code van jou.

Aan je reply te zien is deze oplossing het makkelijkste:

code:


#include <vcl.h>
#pragma hdrstop
#include "winbase.h"
#include "windef.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
HANDLE    hcom;

#pragma argsused
int main(int argc, char* argv[])
{
        int number;
        DCB dcb;
        DWORD NumberOfBytesWritten;
        HANDLE  hcom = CreateFile ("Com1",
                GENERIC_READ|GENERIC_WRITE,
                0,
                0,
                OPEN_EXISTING,
                0,
                0);
        dcb.DCBlength = sizeof(DCB);
        GetCommState(hcom,&dcb);
        dcb.BaudRate = 4800;
        dcb.ByteSize = 8;
        dcb.Parity = NOPARITY;
        dcb.StopBits = ONESTOPBIT;
        SetCommState(hcom, &dcb);

        number = atoi(argv[1]); 
        printf("%d", number); //in argv[1] staat de waarde van $value
        WriteFile(hcom, &number, 1, &NumberOfBytesWritten, NULL);
        Sleep(10);
        CloseHandle(hcom);
        return 0;
}
Anoniem

als ik hem laat runnen dan loopt hij vast.
klopt dat?

Bij mij runt ie gewoon goed. Ook met dat COM poort gebeuren erbij. Welke compiler gebruik je?

Anoniem

hij loopt vast op de regel:
number = atoi(argv[1]);