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


E-24 программа под linux

Вы не вошли.

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

Алексей
24.06.2005 14:05:14
#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, однобайтные команды работают например 0х85 выводит первый и третий канал. Но вот как подключить вход я так и не понял....
Помогите разобраться в чём проблема!!!!!!

Алексей
24.06.2005 14:09:54
#2

Гость

Re: E-24 программа под linux

Второй и третий байт всегда 7F, очень редко 0. Изменение напряжения на входе ни к чему не приводит. -
c7      CON 0 CHAN: 1 P 1 DATA = -11    11100011
7f      CON 1 CHAN: 1 P 1 DATA = -11    11111110
7f      CON 2 CHAN: 1 P 1 DATA = -11    11111110
6a      CON 3 CHAN: 1 P 1 DATA = -11    01010110

c7      CON 0 CHAN: 1 P 1 DATA = -8     11100011
7f      CON 1 CHAN: 1 P 1 DATA = -8     11111110
7f      CON 2 CHAN: 1 P 1 DATA = -8     11111110
70      CON 3 CHAN: 1 P 1 DATA = -8     00001110

c7      CON 0 CHAN: 1 P 1 DATA = -8     11100011
7f      CON 1 CHAN: 1 P 1 DATA = -8     11111110
7f      CON 2 CHAN: 1 P 1 DATA = -8     11111110
70      CON 3 CHAN: 1 P 1 DATA = -8     00001110

c7      CON 0 CHAN: 1 P 1 DATA = -2     11100011
7f      CON 1 CHAN: 1 P 1 DATA = -2     11111110
7f      CON 2 CHAN: 1 P 1 DATA = -2     11111110
7c      CON 3 CHAN: 1 P 1 DATA = -2     00111110

Алексей
01.08.2005 15:04:43
#3

Гость

Re: E-24 программа под linux

Вышел из отпуска, так и не разобраться sad Может с временными параметрами порта,  что-то? Кто-нибудь занимался программированием E-24 под linux? Помогите в чём трабл? В POSIX Serial Programming Guide только два временных параметра VMIN и VTIME, может я их неправильно применяю?