2010-09-04 2 views
3

Я запускаю Ubuntu 9.10, и у меня, похоже, возникают проблемы с termios. Таким образом, я могу начать миникомпьюровать серийный порт в 57600 Baud, 8N1, без управления потоком аппаратного или программного обеспечения, и он отлично работает. Я набираю @ 17 5, и мое устройство отвечает. Когда я пытаюсь настроить свой последовательный порт в своем коде на C++, я не получаю ответа. Я знаю, что программное обеспечение связывается с портом, потому что включается светодиод.C++ Последовательная связь

Вот моя главная:

int main(void) 
{ 
    int fd; /* File descriptor for the port */ 

    fd = open("/dev/keyspan1", O_RDWR | O_NOCTTY | O_NDELAY); 
    if (fd == -1) 
    { 
     /* 
     * Could not open the port. 
     */ 

     perror("open_port: Unable to open /dev/ttyS0 - "); 
    } 
    else 
    fcntl(fd, F_SETFL, 0); 

    /*****************************CHANGE PORT OPTIONS***************************/ 
    struct termios options; 

    /* 
    * Get the current options for the port... 
    */ 

    tcgetattr(fd, &options); 

    /* 
    * Set the baud rates to 57600... 
    */ 

    cfsetispeed(&options, B57600); 
    cfsetospeed(&options, B57600); 

    /* 
    * Enable the receiver and set local mode... 
    */ 

    options.c_cflag |= (CLOCAL | CREAD); 

    /* 
    * Set the new options for the port... 
    */ 


    tcsetattr(fd, TCSANOW, &options); 
    /***********************************END PORT OPTIONS***********************/ 

    int n; 
    n = write(fd, "@17 5 \r", 7); 
    if (n < 0) 
    fputs("write() of 8 bytes failed!\n", stderr); 

    char buff[20]; 

    sleep(1); 

    n = read(fd, buff, 10); 

    printf("Returned = %d\n", n); 

    close(fd); 

    return(0); 
} 

Любые предложения будут оценены. Благодарю.

+0

Возможно, вам просто нужно включить \ n в конец строки, которую вы отправляете? Если это не так, вы можете посмотреть мой код RS-232, который работает под Linux: поиск tcsetattr (и т. Д.) В этом файле: https://public.msli.com/lcs/muscle/muscle/ dataio/RS232DataIO.cpp (Игнорируйте бит Windows, они не имеют отношения к вашей ситуации) –

+0

Не нужно '\ n' ... это небуферизованная операция в небуферизованном файле. – Potatoswatter

+1

Все зависит от того, что слушает на другом конце последовательной линии, и ищет ли он \ n или нет, я бы подумал. –

ответ

2

Возможно, вам необходимо инициализировать терминал в необработанном режиме. Я предлагаю вам использовать cfmakeraw() для инициализации структуры параметров термина. Среди прочего, cfmakeraw будет следить за тем, чтобы управление потоком было отключено, проверки на четность отключены, а вход доступен по символу.

cfmakeraw - это не Posix. Если вы заинтересованы в переносимости, просмотрите справочную страницу cfmakeraw для настроек, которые она создает.

Смежные вопросы