PowerAnt - Могучий Муравей: Научи Свой компьютер Управлять Реальным Миром
PowerAnt это программное управление через RS-232 порт 14 и больше внешними устройствами с помощью компьютера. Открытый, текстовый, хорошо задокументированный протокол управления. Управление электроприборами с потребяемой мощностью до 200Вт. Хотите управлять Реальным Миром даже из MS Excel?.
 Применение
Компьютерный клуб
Компьютерная сеть
Домовая сеть
Умный дом
Прочее
 PowerAnt
Описание
Применение
Тех. характеристики
Документация
Фотографии
 Базовая станция
Описание
Применение
Тех. характеристики
Документация
 Типы PowerAnt
SwSe
SwSw
SeSe
 Скорость работы
MS-DOS
Linux
MS Windows 98
MS Windows 98, Perl
 Программирование
Примеры на Perl
C/C++ - c чего начать
C/C++ - примеры
MS Access 2000
MS Excel 2000
 Заказ
Комплектность
Цены
 ЧаВо
 Новости сайта RSS
 Статьи
 Контакты
 Рейтинги

Программирование на C/C++, примеры программ

Для того, чтобы написать программу для PowerAnt следует прочитать руководство программиста из раздела документация. Некоторые, наиболее простые примеры программ приведены на данной странице, а именно:

  • Бегущий огонек (Linux)
  • Мерцание всеми лампочками (Linux)
  • Программа управления одним PowerAnt типа SwSw (MS Windows)
  • Бегущий огонек

    Linux, gcc. PowerAnt типа SwSe, Огоньки индикации включения выключателей ABCDEFGH по одному гаснут и зажигаются.

    #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);  // Прочистка буфера приема PowerAnt
        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;
    };
    

    Мерцание всеми лампочками

    Linux, gcc. PowerAnt типа SwSe, Огоньки индикации включения выключателей ABCDEFGH по одному гаснут и зажигаются.

    #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);  // Прочистка буфера приема PowerAnt
        int x = 3600;
        while( x-- ){
    	fprintf(powerants,"=AbCdEfGh\r");
            printAnswer();
            fprintf(powerants,"=aBcDeFgH\r");
            printAnswer(); 
        };
        return 0;
    };
    
    

    Программа управления одним PowerAnt типа SwSw (MS Windows)

    Windows, Borland C++ v6. PowerAnt типа SwSw, При помощи окошка с CheckBox и кнопок можно полностью управлять одним устройством.

    #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("?#");        
    }
    

    Полный текст программы доступен для загрузки в виде zip архива.

    PowerAnt это программное управление через RS-232 порт 14 и больше внешними устройствами с помощью компьютера. Открытый, текстовый, хорошо задокументированный протокол управления. Управление электроприборами с потребяемой мощностью до 200Вт. Хотите управлять Реальным Миром даже из MS Excel?.
      © 2004-2022 by  www.anthillsolutions.com