连接到串行设备

时间:2015-11-03 00:07:31

标签: c++ serial-port vala

我正在尝试将字节写入一个串口,我连接一个中继。 一切正常,如果我使用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中的此代码不起作用,继电器不接收任何内容,尽管它使用相同的标志和句柄。 奇怪的是,如果我打开一个终端并运行“tail -f / dev / ttyUSB0”,那么vala代码工作正常。 似乎valacode无法初始化串口,因此继电器永远不会接收它们。

任何人都知道修复此问题,或者在vala代码中发现我的错误? 通常,两种编程语言中的库都应该相同。

0 个答案:

没有答案