Ищете тестовую программу для последовательного порта Linux - PullRequest
0 голосов
/ 17 октября 2011

Я пытаюсь перенести программу на Linux из Windows.

Проблема в том, что я не могу установить скорость передачи успешно (код для этого можно увидеть ниже)

Я настроил осциллограф на кабеле, подключенном к последовательному порту. В версии для Windows я вижу шаблон на 25 микросекундах, но в версии для Linux я вижу тот же шаблон на 250 микросекундах, сообщая мне, что информация верна, но отправляет ее медленно.

Я попытался установить скорость передачи в несколько различных значений, но я все еще получаю то же самое на осциллографе.

То, что я ищу, - это программа, которая настроит последовательный порт на 115200 бод, отметит четность, 1 стоп-бит и 8 бит данных и отправит что-то через линию, чтобы я мог видеть это на гипертерминале. Программа на с ++ была бы фантастической, потому что тогда я мог бы сравнить ее с моей, если она работает.

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

Я пробовал это в течение 3 недель и сделал буквально сотни обучающих программ по последовательному порту и, будучи нубом Linux, я потерян в том, что делать сейчас.

    idComDev[i] = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
    if (idComDev[i] == -1)
    {
    perror("open_port: Unable to open /dev/ttyS0 - ");
    ret = false;
    }
    else
    {
    fcntl(idComDev[i], F_SETFL, 0);

    struct termios options;

    tcgetattr(idComDev[i], &options); // get current settings

    cfsetspeed(&options, B9600); // set baud rate

    test = tcsetattr(idComDev[i], TCSANOW, &options);// save the settings

    options.c_cflag &= ~CSIZE; // Mask the character size bits 
    options.c_cflag |= CS8; // 8 bit data           
    options.c_cflag &= ~PARENB; // set parity to no 
    options.c_cflag &= ~PARODD; // set parity to no 
    options.c_cflag |= CSTOPB; //set one stop bit

    options.c_cflag |= (CLOCAL | CREAD);

    options.c_oflag &= ~OPOST;

    options.c_lflag &= 0;
    options.c_iflag &= 0; //disable software flow controll
    options.c_oflag &= 0;

    tcsetattr(idComDev[i], TCSANOW, &options);// save the settings

    printw("Seg %d = COM%hd",i,CommNo[i]);
    if(test!= -1)
    printw("test success");

Ответы [ 4 ]

1 голос
/ 11 августа 2012

Итак, я знаю, что этот вопрос был опубликован давным-давно, но я думаю, что ваш стоп-бит задом наперед. Если вы хотите установить один стоповый бит, вы должны сделать это:

<code>options.c_cflag &= ~CSTOPB; //set one stop bit

Не это (что у вас было):

<code>options.c_cflag |= CSTOPB; //This sets stop bits to 2, since 1 is the default.

Мой источник: http://www.easysw.com/~mike/serial/serial.html

1 голос
/ 17 октября 2011

Если вы хотите перенести программу последовательного порта Windows в linux, я советую сначала перейти на библиотеку Boost.Asio - она ​​включает кроссплатформенный интерфейс к вашему последовательному порту.Вы можете заставить это работать под Windows, а затем знать, что код будет работать на Linux.

Причина этого в том, что при переходе с windows на последовательные порты linux могут возникать иные проблемы, кроме программного обеспечения.Например, протокол квитирования (RTS / CTS, DTE / DSE) может варьироваться между двумя.

Для начала посмотрите на мой ответ здесь .Если вам нужен полный исходный код, взгляните на github .

Кроме того, этот вопрос катологизирует различные последовательные снифферы, которые могут помочь точно определить, что происходит.

0 голосов
/ 17 октября 2011

Вы можете попробовать:

getty ttyS0 115200 vt100

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

getty ttyS0 9600 vt100

и посмотрите, работает ли она по-прежнему.Вы, вероятно, должны быть пользователем root, чтобы сделать такую ​​вещь, однако.Не могли бы вы также удалить вызов fcntl?

0 голосов
/ 17 октября 2011

Как насчет стандартного инструмента setserial.С его помощью вы можете установить параметры устройства (затем можно выполнить ввод / вывод через файл устройства).Исходный код доступен, поэтому вы можете проверить, как он реализован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...