LINUX.ORG.RU

Слушать com порт, UPS IPPON


0

0

P.S. Эту же тему кинул в HardWare ... так как она относится и к железу .... просьба не пиннать!

Господа, есть UPS фирмы IPPon ... с возможностью получения с него данных ... так-же с сайт взял описание протокола.... Вот что написанно: Computer will control information exchange by a query followed by <cr>. UPS will respond with information followed by a <cr> or action

Status Inquiry: Computer : Q1<cr> UPS : UPS status data stream, such as (MMM.M NNN.N PPP.P QQQ RR.R S.SS TT.T b7b6b5b4b3b2b1b0<cr>

За сим вопрос ... а как в порт закинуть правильно Q1<cr> и считать ответ? пытался через minicom ... рузельтат нулевой ... от UPS`ника данных нет ...

По этому поводу написнно в документации:

Invalid Command/Information Handling

If the UPS receives any command that it could not handle, the UPS should echo the received command back to the computer. The host should check if the command send to UPS been echo or not. If there is any information field in the UPS`s response which is unavailable or not supported, the UPS should fill the field with `@'.

Но в ответ я не получаю ни чего ... В WIND`ах UPS замечательно мониторится ..... порт указываю правильно ... так как он (UPS) выставляет флаги DTR ... которые видны в /proc`е . ;)

По настройке порта, написанно следующее: BAUD RATE............... : 2400 bps DATA LENGTH.......... : 8 bits STOP BIT..................... : 1 bit PARITY........................ : NONE

ТЕ все стандартно ... кто что посоветовать может?

anonymous

>ТЕ все стандартно ... кто что посоветовать может?

А откуда уверенность, что 2400,8,1стоп... это стандартно?

anonymous
()
Ответ на: комментарий от anonymous

Дык в документации по протоколу ..... указанно ... к тому-же я проводил инициализацию с параметрами ... через утилиту stty

anonymous
()
Ответ на: комментарий от anonymous

Насколько я помню, то в линухе не все так просто. Для того что бы RS работал как труба (без фантазий) надо врубить raw mode, сиреч безо всяких там терминалов и прочей умной херни. Как это сделать через stty я не знаю. У меня, по крайней мере, не получилось. Для инициализации под свои нужды накатал мелкую прогу, которая stdio<->tty переправляет как есть.

anonymous
()
Ответ на: комментарий от anonymous

/* во, нашел */
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/poll.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int pipe_in, pipe_out;
int dev_in, dev_out;
int timeout;

int
loop()
{
    struct pollfd polls[2];
    int res;
    char buf[1024*8];

    polls[0].fd = pipe_in;
    polls[0].events = POLLIN;
    polls[1].fd = dev_in;
    polls[1].events = POLLIN;

    for(;;)
    {
        res = poll(polls, 2, timeout);
        if( res<=0 )
            return -1;

        if( polls[0].revents )
        {
            res = read(pipe_in, buf, sizeof(buf));
            if( res<=0 ) return -1;
            write( dev_out, buf, res );
        }

        if( polls[1].revents )
        {
            res = read(dev_in, buf, sizeof(buf));
            if( res<=0 ) return -1;
            write( pipe_out, buf, res );
        }
    }
}

void
init_rs()
{
    struct termios t;
    int speed = B9600;
    
    tcgetattr(dev_out, &t);
    tcflush(dev_out, TCIOFLUSH);
    
    cfsetospeed(&t, speed);
    cfsetispeed(&t, speed);
    
    cfmakeraw(&t);
    
    t.c_cflag &= ~CSTOPB;  /* one stop bit */
    t.c_cflag |= PARENB;   /* enable parity */
    t.c_cflag &= ~PARODD;  /* do even parity */
    t.c_iflag &= ~IGNPAR;  /* don't ignore parity errors */
    t.c_cflag |=CLOCAL;

    //memset( &t.c_cc, 0, sizeof(t.c_cc) );
    tcsetattr(dev_out, TCSANOW, &t);
    tcflush(dev_out, TCIFLUSH);
}

int
main(int argc, char *argv[])
{
    const char *path = 0;
    int i;

    if( argc<2 )
        return 0;

    timeout = 15000;
    for( i=0; i<argc; i++ )
    {
        if( strcmp(argv[i], "-timeout")==0 )
            timeout = atoi(argv[++i]);
        if( strcmp(argv[i], "-dev")==0 )
            path = argv[++i];
    }

    pipe_in  = STDIN_FILENO;
    pipe_out = STDOUT_FILENO;
    dev_in = open( path, O_RDWR|O_NOCTTY|O_NDELAY );
    dev_out = dev_in;
    
    if( dev_in==-1 )
        return -1;
    
    if( strncmp(path, "/dev/ttyS", 9)==0 )
        init_rs();
    
    loop();
    
    close(pipe_in);
    close(pipe_out);
    close(dev_in);

    return 0;
}

anonymous
()

а ты вообще уверен, что UPS работает? что у тебя каблина правельная? а то я сам с этими COM портами (тривеальная штука же) наимелся (хоть и тривеальная а всё равно каканить хрень да вылезает) я б сначала проверил его чем нить приметивным, напрмер под DOS (ногами не бить) программкой

http://www.komtex.permonline.ru/comtest.rar

что он вообще отвечает, или под виндой (только не по голове) МОХОвской программкой PComm (http://web2.moxa.com.tw/services/download/download.asp, выбрать в списке PComm Lite)

а потом уж разбирался, как его к Linux привинчивать

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.