Помогите разобраться с модулем 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, ¶m, 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.
Помогите разобраться в чём проблема!!!!!!