ЗАО «ЗЭО»

Пожалуйста, войдите или зарегистрируйтесь.

Расширенный поиск  

Новости:

Автор Тема: RS-485 под Linux в Тионе-28  (Прочитано 15436 раз)

0 Пользователей и 1 Гость просматривают эту тему.

lman

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 43
Re: RS-485 под Linux в Тионе-28
« Ответ #15 : 04 Июня, 2013, 11:45:32 »

потому что при этом ты загружаешь процессор на 100% и ему уже не до общения с переферией. в каждом бесконечном цикле нужно ставить sleep  хотябы на 5 миллисекунд.
Записан

aborilov

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 90
Re: RS-485 под Linux в Тионе-28
« Ответ #16 : 04 Июня, 2013, 15:10:25 »

sleep в секундах задается.
и у меня стоит 1 секунда, за это время все должно отправиться
Записан

lman

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 43
Re: RS-485 под Linux в Тионе-28
« Ответ #17 : 04 Июня, 2013, 16:47:06 »

пример, что я написал у вас работает?
Записан

aborilov

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 90
Re: RS-485 под Linux в Тионе-28
« Ответ #18 : 05 Июня, 2013, 16:04:15 »

Не работает.
Записан

aborilov

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 90
Re: RS-485 под Linux в Тионе-28
« Ответ #19 : 05 Июня, 2013, 16:10:47 »

Даже вот так не работает
#include <sys/types.h>
#include <sys/stat.h>
#include <termios.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>

#define BAUDRATE B9600
#define DEVICE "/dev/ttySP2"

main(){
    printf("hello");
    int fd;
    struct termios opt;
    fd = open(DEVICE, O_RDWR | O_NOCTTY | O_NDELAY);
    if ( fd < 0 ){
        perror(DEVICE);
    }
    unsigned char data[200] = "Hellodkslnkfndkslakdjaskldjaskldjasasdasdasd";
    opt.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
    opt.c_iflag = IGNPAR;
    opt.c_lflag = 0;
    opt.c_oflag = 0;
    opt.c_cc[VMIN] = 0;      //Minimum bytes available
    opt.c_cc[VTIME] = 0;
    tcflush(fd, TCIFLUSH);
    tcsetattr (fd, TCSANOW, &opt);

//    while(1){
        printf("Sending\n");
        int sended = write(fd, &data, 20);
        tcflush(fd, TCIOFLUSH);
        sleep(5);
//    }
}


программа завершается через 5 секунд.

Если убрать sleep, что бы программа завершалась сразу после записи в линию, то данные в линию уходят.
Записан

SU

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 6
Re: RS-485 под Linux в Тионе-28
« Ответ #20 : 06 Июня, 2013, 10:09:58 »

   Приведенные примеры программы написаны правильно, должны работать.
Более того на Тионе-Про2 у меня аналогичные программы работали без проблем.
   А на Тионе-28 это не работает, потому что драйвер LINUX для Тиона-28 написан некорректно.
Похоже, что при вызове WRITE данные переписываются во внутренний буфер драйвера, а
фактический вывод осуществляется только по команде закрытия файла (либо из текста программы,
либо по закрытии программы).
   Функция SLEEP на вывод никак влиять не может, потому что драйвер работает по аппаратным прерываниям на высоком уровне приоритета. И чем в это время в фоновом режиме загружен процессор
- пользовательской программой или передал управление операционной системе, на его работу не влияет.
   Разработчик  системы Danila обещал разобраться, но пока еще не приступал к задаче.
Записан

aborilov

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 90
Re: RS-485 под Linux в Тионе-28
« Ответ #21 : 06 Июня, 2013, 14:15:43 »

Сделал некоторые изменения в драйвере, теперь могу управлять в ручную переключение-приемом передачей, но проблема осталась так, больше 16 байт не передает, обрезает пакет и все.
Записан

aborilov

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 90
Re: RS-485 под Linux в Тионе-28
« Ответ #22 : 06 Июня, 2013, 16:39:42 »

бью пакеты которые надо послать по 16 байт :)
так работает
Записан

lman

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 43
Re: RS-485 под Linux в Тионе-28
« Ответ #23 : 06 Июня, 2013, 21:39:25 »

  Функция SLEEP на вывод никак влиять не может, потому что драйвер работает по аппаратным прерываниям на высоком уровне приоритета. И чем в это время в фоновом режиме загружен процессор
- пользовательской программой или передал управление операционной системе, на его работу не влияет.

это не совсем так: уберите sleep и поставте скорость 1200 бод в секунду, уберите функцию flush и посмотрите что в итоге получится.
процессор всего 1, буфер 485 порта тоже 1, плюс Ваша запущенная задача работает не в RT режиме..
« Последнее редактирование: 06 Июня, 2013, 22:02:05 от lman »
Записан

SU

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 6
Re: RS-485 под Linux в Тионе-28
« Ответ #24 : 07 Июня, 2013, 08:41:19 »

   Так всегда и делаю. Причем функцию open вызываю с ключом O_NDELAY,
чтобы управление сразу возвращалось программе для обслуживания ввода и
вывода на дисплей.
Записан

Danila

  • Administrator
  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 703
Re: RS-485 под Linux в Тионе-28
« Ответ #25 : 10 Июня, 2013, 13:26:04 »

Проблемой занялся, на этой неделе постараюсь исправить.
Записан

Danila

  • Administrator
  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 703
Re: RS-485 под Linux в Тионе-28
« Ответ #26 : 10 Июня, 2013, 22:11:00 »

Добавил новый образ, RS-485 должен работать нормально.
Вот пример, который у меня работает:

#include <sys/types.h>
#include <sys/stat.h>
#include <termios.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>

 
#define BAUDRATE B9600
#define DEVICE "/dev/ttySP2"
#define M_SIZE   90
 
main(){
    printf("Start\r\n");
    int fd;
    struct termios opt;
    fd = open(DEVICE, O_RDWR | O_NOCTTY | O_NDELAY);
    if ( fd < 0 ){
        perror(DEVICE);
    }
    unsigned char data[100] = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
    opt.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
    opt.c_iflag = IGNPAR;
    opt.c_lflag = 0;
    opt.c_oflag = 0;
    opt.c_cc[VMIN] = 0;      //Minimum bytes available
    opt.c_cc[VTIME] = 0;
    tcflush(fd, TCIFLUSH);
    tcsetattr (fd, TCSANOW, &opt);
 
    while(1){
        printf("Sending %d bytes\n",  M_SIZE);
        int sended = write(fd, &data, M_SIZE);       
        sleep(1);
    }
}
Записан

Danila

  • Administrator
  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 703
Re: RS-485 под Linux в Тионе-28
« Ответ #27 : 10 Июня, 2013, 22:16:49 »

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

Уберите "tcflush(fd, TCIOFLUSH);"   Этой командой Вы же очищаете выходную очередь. Или используйте с флагом TCIFLUSH.
В новом образе эхо отключено, можно не использовать эту команду.
Записан

aborilov

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 90
Re: RS-485 под Linux в Тионе-28
« Ответ #28 : 11 Июня, 2013, 08:58:51 »

Добавил новый образ, RS-485 должен работать нормально.

а можно патч для ядра, что конкретно в драйвере поменялось?
Записан

aborilov

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 90
Re: RS-485 под Linux в Тионе-28
« Ответ #29 : 11 Июня, 2013, 09:00:55 »

и в том варианте что у меня сейчас, я вижу эхо на линии
Записан