Подключить к последовательному устройству

Я пытаюсь записать байты в последовательный порт, где я подключаю реле.
Все работает нормально, если я использую C ++ для этого: (комментарии немецкие, извините)

#include <fcntl.h>

#include <termios.h>

RelayProtocol::RelayProtocol()
{
// Create structure
struct termios options;

// Open Connection
_handle = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);

// clear all flags
fcntl(_handle, F_SETFL, 0);

// Get current options
tcgetattr(_handle, &options);

// Set Boundrate (19200)
cfsetispeed(&options, B19200); // Input
cfsetospeed(&options, B19200); // Output

// Set serial-flags
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag |= (CLOCAL | CREAD);

options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_oflag &= ~OPOST;
options.c_cc[VMIN]  = 0;
options.c_cc[VTIME] = 10;

// Flush settings
tcflush(_handle,TCIOFLUSH);

tcsetattr(_handle, TCSAFLUSH, &options);

fcntl(_handle, F_SETFL, FNDELAY);
fcntl(_handle, F_SETFL, 0);

// Initialize relay
SendCommand(1, 1, 0);
}

Теперь я попробовал то же самое, используя vala:

 public static void main (string[] args) {
int handle = Posix.open ("/dev/ttyUSB0", Posix.O_RDWR | Posix.O_NOCTTY | O_NDELAY);

Posix.termios termios;

Posix.fcntl (handle, Posix.F_SETFL, 0);

Posix.tcgetattr (handle, out termios);termios.c_ispeed = 19200;
termios.c_ospeed = 19200;

/* Configure serialport */
termios.c_cflag &= ~Posix.PARENB;
termios.c_cflag &= ~Posix.CSTOPB;
termios.c_cflag &= ~Posix.CSIZE;
termios.c_cflag |= Posix.CS8;
termios.c_cflag |= (Posix.CLOCAL | Posix.CREAD);

termios.c_lflag &= ~(Posix.ICANON | Posix.ECHO | Posix.ECHOE | Posix.ISIG);
termios.c_oflag &= ~Posix.OPOST;

termios.c_cc[Posix.VMIN] = 0;
termios.c_cc[Posix.VTIME] = 10;

Posix.tcflush (handle, Posix.TCIOFLUSH);

Posix.tcsetattr (handle, Posix.TCSAFLUSH, termios);

Posix.fcntl (handle, Posix.F_SETFL, FNDELAY);
Posix.fcntl (handle, Posix.F_SETFL, 0);

/* Everything works fine, if I open it using tail -f /dev/ttyUSB0*/
uint8[] data = new uint8[4];
data[0] = 1;
data[1] = 1;
data[2] = 0;
data[3] = data[0] ^ data[1] ^ data[2];

int l = (int)Posix.write (handle, data, data.length);

Thread.usleep (1000 * 1000);

data[0] = make_array (2, true)[0];
data[1] = make_array (2, true)[1];
data[2] = make_array (2, true)[2];
data[3] = data[0] ^ data[1] ^ data[2];

l = (int)Posix.write (handle, data, data.length);
}

Я создал две переменные сверху, которых нет в пространстве имен posix. Я просто печатаю значение в C.
Этот код в vala не работает, реле ничего не получает, хотя использует те же флаги и дескрипторы.
Странно то, что код vala работает нормально, если я открываю терминал и запускаю «tail -f / dev / ttyUSB0».
Кажется, что valacode не может инициализировать последовательный порт, поэтому реле никогда не получит их.

Кто-нибудь знает, как исправить это, или найти мою ошибку в коде Вала?
Обычно библиотеки должны быть одинаковыми на обоих языках программирования.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]