PowerAnt: Apprenez à votre Ordinateur à Piloter le Monde Réel
PowerAnt peut commander 14 appareils externes et plus, ceci depuis votre ordianteur, via le port RS232. Le protocole de communication est simple à mettre en oeuvre et vous trouverez une description complète dans le manuel de programmation. Les équipements électriques à piloter peuvent aller jusqu'à 200W. Possible de piloter des appareils à partir de MS Excel ?
 PowerAnt
Description
Applications
Caractéristiques
Documentation
Photos
 Modèles de PowerAnt
SwSe
SwSw
SeSe
 Programmation
Exemples en Perl
Exemples en C/C++
MS Access 2000
MS Excel 2000
 Achat
Contenu du paquet
Tarifs
 Nouvelles RSS
 Contacts
 ë  ListTop.Ru Rambler's Top100

Programmation C/C++, exemples

Avant tout, lisez le manuel de programmation (vous pouvez le trouver sur la page dedocumentation). Quelques exemples de programmes en C/C++ son décrit sur ces pages :

  • Chenillard à leds (Linux)
  • Clignotement de leds (Linux)
  • Programme de pilotage d'un PowerAnt de type SwSw (MS Windows)
  • Chenillard à leds

    Linux, gcc. PowerAnt de type SwSe. Allume et éteint les leds une part une.

    #include <stdio.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <string.h>
    #include <termios.h>
    #include <unistd.h>
    
    
    void init_raw_tty( int fd ){
        struct termios newtio;
    
        bzero(&newtio, sizeof(newtio));
        newtio.c_cflag  = B9600 | CS8 | CLOCAL | CREAD;
        newtio.c_iflag  = IGNPAR;
        newtio.c_oflag  = 0;
    	        
        /* set input mode (non-canonical, no echo,...) */
        newtio.c_lflag = 0;
    				         
        newtio.c_cc[VTIME]    = 10;
        newtio.c_cc[VMIN]     = 0; 
    
        tcflush(fd, TCIFLUSH);
        tcsetattr(fd,TCSANOW,&newtio);
    }
    
    FILE * powerants;
    int powerants_int;
    
    void printAnswer( void ){
        int inCh;
        do {
            inCh = fgetc(powerants);
            if( inCh > 0 ){
        	    //printf("%c",inCh);
            } else { 
    	    printf("x"); 
    	    fputc(0x1B,powerants);
    	    fflush(powerants);
    	    tcdrain(powerants_int);
    	    fprintf(powerants,"?%\r");
    	    fflush(powerants);
    	    tcdrain(powerants_int);
    	};
        } while( inCh != 0x0D );  
    }
    
    int main( int ArgC, char * ArgV[] ){
        powerants_int = open("/dev/ttyS1",O_RDWR | O_NOCTTY );
    
        if(! powerants_int ){
    	fprintf( stderr, "ERROR: (open) %s\n", strerror( errno ) );
    	return -1;
        };
        
        init_raw_tty( powerants_int );
        powerants = fdopen( powerants_int, "w+b" );
    
        fprintf(powerants,"%c",0x1B);  // Clear PowerAnt input buffer
        fprintf(powerants,"??\r");
        printAnswer();
        fprintf(powerants,"=ABCDEFGH\r");
        printf("=ABCDEFGH\n");
        printAnswer();
        char ltr = 'A';
        char ltr2 = 'a';
        int x = 3600;
        while( x-- ){
    	fprintf(powerants,"=%c\r",ltr);
    	//printf("=%c\n",ltr);
    	printAnswer();
    	//usleep( 1 );	
    	fprintf(powerants,"=%c\r",ltr2);
    	//printf("=%c\n",ltr2);
    	printAnswer();
    	//usleep( 1 );	
    	ltr++;
    	ltr2++;
    	if( ltr > 'H'){
    	    ltr = 'A';
    	    ltr2 = 'a';
    	}; 
        };
        return 0;
    };
    

    Clignotement de leds

    Linux, gcc. PowerAnt de type SwSe. Fait clignoter l'ensemble des leds. Le programme est trop rapide et l'utilisateur verra les leds toujours allumées :). .

    #include <stdio.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <string.h>
    #include <termios.h>
    #include <unistd.h>
    
    
    void init_raw_tty( int fd ){
        struct termios newtio;
    
        bzero(&newtio, sizeof(newtio));
        newtio.c_cflag  = B9600 | CS8 | CLOCAL | CREAD;
        newtio.c_iflag  = IGNPAR;
        newtio.c_oflag  = 0;
    	        
        /* set input mode (non-canonical, no echo,...) */
        newtio.c_lflag = 0;
    				         
        newtio.c_cc[VTIME]    = 10;
        newtio.c_cc[VMIN]     = 0; 
    
        tcflush(fd, TCIFLUSH);
        tcsetattr(fd,TCSANOW,&newtio);
    }
    
    FILE * powerants;
    int powerants_int;
    
    void printAnswer( void ){
        int inCh;
        do {
            inCh = fgetc(powerants);
            if( inCh > 0 ){
        	    printf("%c",inCh);
            } else { 
    	    printf("x"); 
    	};
        } while( inCh != 0x0D );  
    }
    
    int main( int ArgC, char * ArgV[] ){
        powerants_int = open("/dev/ttyS1",O_RDWR | O_NOCTTY );
    
        if(! powerants_int ){
    	fprintf( stderr, "ERROR: (open) %s\n", strerror( errno ) );
    	return -1;
        };
        
        init_raw_tty( powerants_int );
        powerants = fdopen( powerants_int, "w+b" );
    
        fprintf(powerants,"%c",0x1B);  // Clear the PowerAnt input buffer
        int x = 3600;
        while( x-- ){
    	fprintf(powerants,"=AbCdEfGh\r");
            printAnswer();
            fprintf(powerants,"=aBcDeFgH\r");
            printAnswer(); 
        };
        return 0;
    };
    
    

    Interface de pilotage d'un PowerAnt de type SwSw (MS Windows)

    Windows, Borland C++ v6. PowerAnt de type SwSw, La fenêtre du programme vous donne le controle total d'un PowerAnt.

    #include <vcl.h>
    #pragma hdrstop
    
    #include "Begin.h"
    
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    
    #include <winbase.h>
    #include <stdio.h>
    
    DCB	pwrAntDCB;
    HANDLE	pwrAntHANDLE;
    COMMTIMEOUTS pwrAntCommTimeouts;
    
    void ShowError( const char * whereError ){
    	LPVOID lpMsgBuf;
    	FormatMessage(
    	    FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
    	    NULL,
    	    GetLastError(),
    	    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    	    (LPTSTR) &lpMsgBuf,
    	    0,
    	    NULL
    	);
    	// Display the string.
    	MessageBox( NULL, (const char *)lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );
    
    	// Free the buffer.
    	LocalFree( lpMsgBuf );
    }
    
    BOOL openPwrAntPort( const char * comName ){
            pwrAntHANDLE = CreateFile(
                    comName
                    ,GENERIC_READ | GENERIC_WRITE // Read-Write access
                    ,0 // Cannot be shared
                    ,NULL // Security Attributes
                    ,OPEN_EXISTING // Open existing file
                    ,FILE_ATTRIBUTE_NORMAL || FILE_FLAG_WRITE_THROUGH // | FILE_FLAG_NO_BUFFERING // Auto flush
                    ,NULL // Template File
            );
    	if( ! pwrAntHANDLE ){
                    ShowError("CreateFile");
    		return FALSE;
    	};
            if( ! GetCommState( pwrAntHANDLE, &pwrAntDCB )){
                    ShowError("GetCommState");
    		return FALSE;
            };
            if( ! BuildCommDCB( "baud=9600 parity=N data=8 stop=1", &pwrAntDCB ) ){
                    ShowError("BuildCommDCB");
    		return FALSE;
            };
            if( ! SetCommState( pwrAntHANDLE, &pwrAntDCB )){
                    ShowError("SetCommState");
    		return FALSE;
            };
            if( ! GetCommTimeouts( pwrAntHANDLE, &pwrAntCommTimeouts ) ){
                    ShowError("GetCommTimeouts");
    		return FALSE;
            };
    
            pwrAntCommTimeouts.ReadIntervalTimeout          = 10; // milliseconds
            pwrAntCommTimeouts.ReadTotalTimeoutMultiplier   = 0;  //
            pwrAntCommTimeouts.ReadTotalTimeoutConstant     = 0;  //
            pwrAntCommTimeouts.WriteTotalTimeoutMultiplier  = 0;  //
            pwrAntCommTimeouts.WriteTotalTimeoutConstant    = 0;  //
    
            if( ! SetCommTimeouts( pwrAntHANDLE, &pwrAntCommTimeouts ) ){
                    ShowError("SetCommTimeouts");
    		return FALSE;
            };
    	return TRUE;
    }
    
    BOOL pwrAntCMD( const char * cmd ){
    	unsigned char buff[70];
    	unsigned long i;
            unsigned long io_i;
    	for( i = 0 ; cmd[i] ; i++ ){
    		buff[i] = cmd[i];
    	};
    	buff[i++] = 0x0D;
    	buff[i++] = 0x00; //
    /*        {
                    unsigned char buff2[100];
                    unsigned char * buffptr = buff2;
                    MessageBox( NULL, buff , "Send Command", MB_OK|MB_ICONINFORMATION );
                    for( unsigned int x = 0 ; x < i ; x++ ){
                            buffptr += sprintf( buffptr, "%02x ", buff[x] );
                    };
                    MessageBox( NULL, buff2 , "Answer by Bytes", MB_OK|MB_ICONINFORMATION );
            }
    */	if( ! WriteFile(
    			pwrAntHANDLE
    			,buff
    			, i-1 // Do not send Zero at end of command
                            , &io_i
                            , NULL
    	)){
    		ShowError("WriteFile");
    		return FALSE;
    	};
    	if( ! FlushFileBuffers( pwrAntHANDLE )){
                    ShowError("FlushFileBuffers");
                    return FALSE;
            };
            // Read the answer from PowerAnt
            if( ! ReadFile(
                    pwrAntHANDLE
                    ,buff
                    , 50 // Full PowerAnt Buffer Length
                    , &io_i
                    , NULL
            )){
                    ShowError("ReadFile");
                    return FALSE;
            };
            buff[io_i] = 0; // Null Termination
            if( io_i > 3 || (buff[0] != '+') ){
                    MessageBox( NULL, buff , "Command execution result", MB_OK|MB_ICONINFORMATION );
                    /*
                    unsigned char buff2[100];
                    unsigned char * buffptr = buff2;
                    for( unsigned int x = 0 ; x < io_i ; x++ ){
                            buffptr += sprintf( buffptr, "%02x ", buff[x] );
                    };
                    MessageBox( NULL, buff2 , "Answer by Bytes", MB_OK|MB_ICONINFORMATION );
                    */
            };
    	return TRUE;
    }
    
    void closePwrAntPort( void ){
            if( ! CloseHandle( pwrAntHANDLE )){
                    ShowError("CloseFile");
    		return;
    	};
    }
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
            openPwrAntPort( "COM2" );
    }
    
    
    
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
            closePwrAntPort();
    }
    
    void __fastcall TForm1::Button1Click(TObject *Sender){
            // In Edit1 properties field OEMConvert MUST BE TRUE!
            pwrAntCMD( Edit1->Text.c_str() );
    }
    
    
    
    void __fastcall TForm1::CheckBox12Click(TObject *Sender)
    {
            if( CheckBox12->Checked ){
                    pwrAntCMD("=E");
            } else {
                    pwrAntCMD("=e");
            };
    }
    
    
    void __fastcall TForm1::CheckBox11Click(TObject *Sender)
    {
            if( CheckBox11->Checked ){
                    pwrAntCMD("=F");
            } else {
                    pwrAntCMD("=f");
            };
    }
    
    
    void __fastcall TForm1::CheckBox10Click(TObject *Sender)
    {
            if( CheckBox10->Checked ){
                    pwrAntCMD("=G");
            } else {
                    pwrAntCMD("=g");
            };
    }
    
    
    void __fastcall TForm1::CheckBox9Click(TObject *Sender)
    {
            if( CheckBox9->Checked ){
                    pwrAntCMD("=H");
            } else {
                    pwrAntCMD("=h");
            };
    }
    
    
    void __fastcall TForm1::CheckBox16Click(TObject *Sender)
    {
            if( CheckBox16->Checked ){
                    pwrAntCMD("=N");
            } else {
                    pwrAntCMD("=n");
            };
    }
    
    
    void __fastcall TForm1::CheckBox15Click(TObject *Sender)
    {
            if( CheckBox15->Checked ){
                    pwrAntCMD("=M");
            } else {
                    pwrAntCMD("=m");
            };
    }
    
    
    void __fastcall TForm1::CheckBox14Click(TObject *Sender)
    {
            if( CheckBox14->Checked ){
                    pwrAntCMD("=L");
            } else {
                    pwrAntCMD("=l");
            };
    }
    
    
    void __fastcall TForm1::CheckBox4Click(TObject *Sender)
    {
            if( CheckBox4->Checked ){
                    pwrAntCMD("=D");
            } else {
                    pwrAntCMD("=d");
            };
    }
    
    
    void __fastcall TForm1::CheckBox3Click(TObject *Sender)
    {
            if( CheckBox3->Checked ){
                    pwrAntCMD("=C");
            } else {
                    pwrAntCMD("=c");
            };
    }
    
    
    void __fastcall TForm1::CheckBox2Click(TObject *Sender)
    {
            if( CheckBox2->Checked ){
                    pwrAntCMD("=B");
            } else {
                    pwrAntCMD("=b");
            };
    }
    
    
    void __fastcall TForm1::CheckBox5Click(TObject *Sender)
    {
            if( CheckBox5->Checked ){
                    pwrAntCMD("=A");
            } else {
                    pwrAntCMD("=a");
            };
    
    }
    
    
    void __fastcall TForm1::CheckBox8Click(TObject *Sender)
    {
            if( CheckBox8->Checked ){
                    pwrAntCMD("=I");
            } else {
                    pwrAntCMD("=i");
            };
    }
    
    
    void __fastcall TForm1::CheckBox7Click(TObject *Sender)
    {
            if( CheckBox7->Checked ){
                    pwrAntCMD("=J");
            } else {
                    pwrAntCMD("=j");
            };
    }
    
    
    void __fastcall TForm1::CheckBox6Click(TObject *Sender)
    {
            if( CheckBox6->Checked ){
                    pwrAntCMD("=K");
            } else {
                    pwrAntCMD("=k");
            };
    }
    
    
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
            pwrAntCMD("??");
    }
    
    
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
            pwrAntCMD("?=");        
    }
    
    
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
            pwrAntCMD("?%");        
    }
    
    
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
            pwrAntCMD("?#");        
    }
    

    Vous pouvez télécharger les différents codes sources au format Zip.

    PowerAnt peut commander 14 appareils externes et plus, ceci depuis votre ordianteur, via le port RS232. Le protocole de communication est simple à mettre en oeuvre et vous trouverez une description complète dans le manuel de programmation. Les équipements électriques à piloter peuvent aller jusqu'à 200W. Possible de piloter des appareils à partir de MS Excel ?
    Traduit par/Translate by Nicolas LE FEVRE -   © 2004-2014 by  www.anthillsolutions.com