Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года

E-24 под linux

Вы не вошли.

 Поиск | Регистрация | Вход 

Алексей
24.06.2005 10:31:38
#1

Гость

E-24 под linux

Помогите разобраться с модулем E-24.
Надо срочно написать программу под linux для измерений. Вот исходник (делается по примеру с диска)... C++ компилятор gcc-3.4.3 ...

#include <iostream>
using namespace std;
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <sys/ioctl.h>

void to8(int  n, int bit=8) {
      int  i,t;
      for (i=0;i<bit;i++) {
       t=1 << i;
       if ((n&t) > 0 ) cout << "1";
       else            cout << "0";
      }
}

int main() {
    int fd;

    fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
    cout << " FD!: = " << fd << "/n";
    if (fd == -1) {
     cout << "Error/n";
     close (fd);
     exit(1);
    }
    else

    fcntl(fd, F_SETFL, 0);

    struct termios options;
    tcgetattr(fd, &options);

// Параметры порта       
    cfsetspeed(&options, B19200);
    cout << "speed = " << "B19200" << "/n";
    options.c_cflag &= ~(PARENB | CSTOPB | CSIZE);
    options.c_cflag |= (CLOCAL | CREAD | CS8 | CRTSCTS);
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    options.c_oflag &= ~OPOST;
    options.c_cc[VMIN] = 14;
    options.c_cc[VTIME] = 0;
    tcsetattr(fd, TCSANOW, &options);
   // Питание     
    int status;
    ioctl(fd, TIOCMGET, &status);
    status &= ~TIOCM_DTR;
    status |= TIOCM_RTS;
    ioctl(fd, TIOCMSET, &status);

/* STARTING PARAMETRS */
    cout << "START PARM  0x90 /n";
    int ss[3];
    ss[0] = 0x0; ss[1]= 0x0; ss[2]=0x91;
    tcflush(fd, TCOFLUSH);
    write(fd, &ss, 3);
   
    int ss1 = 0xdf; // Переинициализация
    tcflush(fd, TCIOFLUSH);
    write(fd, &ss1, 1);
    sleep (1);
 
    cout << "START PARM  0xc0 /n";
    ss[0] = 0x1; ss[1]= 0x1; ss[2]=0xc1;
    tcflush(fd, TCIOFLUSH);
    write(fd, &ss, 3);
   
    cout << " REINICIALISE  /n";       
    ss1 = 0xdf;
    tcflush(fd, TCIOFLUSH);
    write(fd, &ss1, 1);
   
    cout << "  !STOP!        /n";
    ss1 = 0xff;
    tcflush(fd, TCIOFLUSH);
    write(fd, &ss1, 1);
       
    sleep (1);
   
    cout << "           !READ PARAM!        /n";
    ss1 = 0xf5;
    tcflush(fd, TCIOFLUSH);
    write(fd, &ss1, 1);

    ss1 = 0xdf;
    tcflush(fd, TCIOFLUSH);
    write(fd, &ss1, 1);
   
    int con2=0;
    unsigned char param[14];
    read(fd, &param, 14);
   
    while(con2<14) {
cout << hex << int(param[con2]) << dec << " CON " << con2;   
    con2++;
    cout << "/n";
    }
!!!! Вот здесь первая проблема !!!
Выводит программа следующее:
ee      CON 0
ea      CON 1
7       CON 2
80      CON 3
88      CON 4
7       CON 5
80      CON 6
88      CON 7
7       CON 8
80      CON 9
88      CON 10
7       CON 11
80      CON 12
88      CON 13

то есть, параметры(режимы работы) в модуле не меняются???

Далее ....

    cout << "           !STOP!        /n";
    ss1 = 0xff;
    tcflush(fd, TCIOFLUSH);
    write(fd, &ss1, 1);
    sleep (1);
// Другой режим порта читаем по 4 байта   
    options.c_cc[VMIN] = 4;
    tcflush(fd, TCIFLUSH);
    tcsetattr(fd, TCSANOW, &options);
   
    cout << "  ******* START *******  /n";
    ss1 = 0x81;
    tcflush(fd, TCIOFLUSH);
    write(fd, &ss1, 1);

    unsigned char data_rd[4];   
        int count = 30;
    while(count) {
    read(fd, &data_rd, 4);

    int con1=0;
    long conv_data;
    while(con1<4) {

conv_data=int((data_rd[3]>>1)&0x3f)|(int(data_rd[2])<<6)| /
                 (int(data_rd[1])<<13)|(int(data_rd[0]&0xf)<<20);
conv_data-=0x800000;

cout << hex << int(data_rd[con1]) << dec << " CON " << con1 /
<< " CHAN: " << (int(data_rd[0]>>4)&3)+1 << " P " /
<< (int(data_rd[0]&0x40)>>6) << " DATA = " << conv_data << " ";
 
    to8(int(data_rd[con1])); cout << " ";
    to8(conv_data,24);

con1++;
cout << "/n";
}
    cout << "/n";
        count--;
    }
   
    cout << "           !STOP!        /n";
    ss1 = 0xff;
    fcntl(fd,F_SETFL,0);
    write(fd, &ss1, 1);
    close(fd);
   
    return 0;
}

Вот здесь вторая проблема на входе 1.019В, а выводит: (пишу упрощённо)

c7      CON 0 CHAN: 1 P 1 DATA = -5     11100011
7f      CON 1 CHAN: 1 P 1 DATA = -5     11111110
7f      CON 2 CHAN: 1 P 1 DATA = -5     11111110
76      CON 3 CHAN: 1 P 1 DATA = -5     01101110
и меняется незначительно только последний байт, т.е. вход получается не подключён? "Сухой контакт" меняется, т.е. P на выводе становиться 0.
Помогите разобраться в чём проблема!!!!!!

Алексей
24.06.2005 11:15:56
#2

Гость

Re: E-24 под linux

Да, совсем забыл, однобайтные команды работают например 0х85 выводит первый и третий канал. Но вот как подключить вход я так и не понял....

Прохожий
24.06.2005 16:39:00
#3

Гость

Re: E-24 под linux

Алексей, перенесите тему в конф. "Техническая поддержка" - тут Вам могут не ответить

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск