Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> С++ в Linux и RS485 работа с протоколом, Работа с протоколом 
:(
    Опции темы
xvr
Дата 11.4.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(Oligarch @ 11.4.2009,  08:02)
Помогите пожалуста.
Почему то при чтении из порта при помощи команды read(), читается не больше 14 символов, сколько бы я не указывал читать в последнем параметре read().

На эти грабли уже наступали в соседней ветке (в другом разделе, правда). 14 байт - размер аппаратного FIFO у порта. Остальные байты просто еще не успели прийти. Читайте read'ом в цикле, пока не наберется сколько надо. Еще можно настроить timeout'ы приема символов (не знаю, где это настраивается в Linux, ищите)

PM MAIL   Вверх
Oligarch
Дата 11.4.2009, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 8.8.2007

Репутация: нет
Всего: нет



спасибо.
PM MAIL   Вверх
Oligarch
Дата 11.4.2009, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 8.8.2007

Репутация: нет
Всего: нет



v cikle eto ponyatno. Prosto mne ydobnee kogda potok, v kotorom budet vipolnyat'sya etot kod, budet gdat' priema vsego paketa, kotoryi ochen' dlinnui. A v to vremya poka on gdet, drygie potoki bydyt vipolnyat'sya. Ya ychitivay eto, potomy chto proga dolgna rabotat' na controllere ARM9 (200MHz), poetomy kipeshy za bistrodeistvie i proizvoditel'nos't.
Ya ge vistavil time-out:
termios_struct.c_cc[VMIN]=0;
termios_struct.c_cc[VTIME]=1;
eto oznachaet, chto read() budet otschitivat' 100ms dlya kagdogo vhodyashego simvola, i kak tol'ko dlya kakogo nibud' simvola time_out isteket, to read() vozvratit prochitannie simvoli.
Eto tak ved'?
moget vse taki kak to mogno bez cikla i bez vremennoi zadergki megdy zapis'y i chteniem oboitis'?
PM MAIL   Вверх
xvr
Дата 11.4.2009, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(Oligarch @ 11.4.2009,  11:28)
Ya ge vistavil time-out:
termios_struct.c_cc[VMIN]=0;
termios_struct.c_cc[VTIME]=1;
eto oznachaet, chto read() budet otschitivat' 100ms dlya kagdogo vhodyashego simvola, i kak tol'ko dlya kakogo nibud' simvola time_out isteket, to read() vozvratit prochitannie simvoli.
Eto tak ved'?

Нет
Цитата

Case A: MIN > 0, TIME > 0
In this case TIME serves as an inter-byte timer and is activated after the first byte is received. Since it is an inter-byte timer, it is reset after a byte is received. The interaction between MIN and TIME is as follows. As soon as one byte is received, the inter-byte timer is started. If MIN bytes are received before the inter-byte timer expires (remember that the timer is reset upon receipt of each byte), the read is satisfied. If the timer expires before MIN bytes are received, the characters received to that point are returned to the user. Note that if TIME expires at least one byte is returned because the timer would not have been enabled unless a byte was received. In this case (MIN > 0, TIME > 0) the read blocks until the MIN and TIME mechanisms are activated by the receipt of the first byte, or a signal is received. If the data is in the buffer at the time of the read(), the result will be as if the data has been received immediately after the read().

Case C: MIN = 0, TIME > 0
In this case, since MIN = 0, TIME no longer represents an inter-byte timer. It now serves as a read timer that is activated as soon as the read() function is processed. A read is satisfied as soon as a single byte is received or the read timer expires. Note that in this case if the timer expires, no bytes are returned. If the timer does not expire, the only way the read can be satisfied is if a byte is received. In this case the read will not block indefinitely waiting for a byte; if no byte is received within TIME*0.1 seconds after the read is initiated, the read() returns a value of zero, having read no data. If the data is in the buffer at the time of the read(), the timer is started as if the data has been received immediately after the read(). 
Поставьте в VMIN размер вашего буфера

PM MAIL   Вверх
Oligarch
Дата 27.4.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 8.8.2007

Репутация: нет
Всего: нет



Как там дела с переключением приема/передачи RS-485 под линуксом? Не решил еще? Если решил, вышли код.
у меня отладочная плата с микроконтроллером AT91SAM9260 (линукс вшит во флэш), её UASRT'ы могут работать в режиме RS-485. Переключение в этот режим происходит выставлением определенного бита в управляющем регистре порта. В этом режиме контроллер автоматически дёргает ногой RTS, которая запаяна на управляющий вход управления приемом/передачей схемы RS-485 интерфейса. И всё бы хорошо, но как из под линукса достучаться до этого управляющего регистра и выставить порт в режим RS-485. Либо можно как то программно дёргать этой ногой RST? опять же будет неизвестно все ли данные отосланы перед выставлением интерфейса на прием....

Это сообщение отредактировал(а) Oligarch - 27.4.2009, 22:02
PM MAIL   Вверх
hente
Дата 30.4.2009, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.3.2009
Где: Томск

Репутация: нет
Всего: нет



Для начала чтобы из ком порта сделать RS485 необходимо выставить джампера на плате(в соответствии с документацией на плату)

Далее 2 пути:

1) Программный, тогда тебе надо будет удостовериться что стоят драйвера(либо при необходимости поставить их), и используешь стандартные функции Read/write (я делал именно так)

2)Аппаратный тут либо ты используешь функцию ioctl либо явно через регистры выставляешь то что те надо

ща поищу доку к регистрам ...

Это сообщение отредактировал(а) hente - 30.4.2009, 10:58
--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
demon051
Дата 20.12.2019, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.7.2011

Репутация: нет
Всего: нет



для примера
Код

#include <iostream>
#include <signal.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>

#include <linux/serial.h>
#include <sys/ioctl.h>

using namespace std;

it fd = -1;

void handlerSIGTERM(int nsig)
{
    if(fd>0)
        close(fd);
    exit(0);
}

int main(int argc, char *argv[])
{    
    signal(SIGINT, handlerSIGTERM); 
    signal(SIGTERM, handlerSIGTERM);
    signal(SIGQUIT, handlerSIGTERM);

    int baudrate = 9600;

    string device = "/dev/ttymxc1";

    cout << "Test Com Port (RS-485)..." << endl;
    cout << "Device: "<<device<<endl;
    cout << "Baudrate: "<<baudrate<<endl;
    cout << "Waiting for data..."<<"(press Ctrl+C to exit)" << endl;


    int res;
    unsigned char buf[255];

    fd = open(device.data(), O_RDWR | O_NOCTTY /*| O_NDELAY*/);
    if (fd == -1)
    {
        cout<< "Could not open device "<<device<<endl;
        perror(device.data());
        exit(-1);
    }
    else
       fcntl(fd, F_SETFL, 0);


    struct termios options;

    // Получение текущих опций для порта...

    tcgetattr(fd, &options);

    // Установка скорости передачи...

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

    // Разрешение приемника и установка локального режима...

    options.c_cflag |= (CLOCAL | CREAD);
    //Отсутствие проверки на четность (8N1):
    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;

    //Выбор неканонического (Raw) ввода
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

    options.c_cc[VTIME]    = 0;   // посимвольный таймер не используется
    options.c_cc[VMIN]     = 4;   // блокировка чтения до тех пор пока не будут приняты 4 байта
    // Установка новых опций для порта...

    tcsetattr(fd, TCSANOW, &options);

    struct serial_rs485 rs485conf;

    /* Enable RS485 mode: */
    rs485conf.flags |= SER_RS485_ENABLED;

    /* Set logical level for RTS pin equal to 1 when sending: */
    rs485conf.flags |= SER_RS485_RTS_ON_SEND;
    /* or, set logical level for RTS pin equal to 0 when sending: */
    rs485conf.flags &= ~(SER_RS485_RTS_ON_SEND);

    /* Set logical level for RTS pin equal to 1 after sending: */
    rs485conf.flags |= SER_RS485_RTS_AFTER_SEND;
    /* or, set logical level for RTS pin equal to 0 after sending: */
    rs485conf.flags &= ~(SER_RS485_RTS_AFTER_SEND);

    /* Set rts delay before send, if needed: */
    //rs485conf.delay_rts_before_send = ...;

    /* Set rts delay after send, if needed: */
    //rs485conf.delay_rts_after_send = ...;

    /* Set this flag if you want to receive data even while sending data */
    //rs485conf.flags |= SER_RS485_RX_DURING_TX;

    if (ioctl (fd, TIOCSRS485, &rs485conf) < 0) {
        /* Error handling. See errno. */
        cout<< "Could not set RS-485 settings!"<<endl;
        if(fd>0) close(fd);
        exit(-1);
    }

    while (1)
    { /* цикл ввода/вывода */
        res = read(fd,buf,255);   /* выход после приема/ввода 4-х байт */
        buf[res]=0;               /* для того чтобы мы могли использовать printf... */
        printf(":%s:%d\n", buf, res);
        cout<< "Data sending... "<<endl;

        int n = write(fd, buf, res);
        if(n==res)
           cout << "OK! "<<endl;
        else
           cout << "Error! Sent "<<n<<" bytes instead of "<<res<<endl;
    }

    close(fd);   
    return 0;
}


Это сообщение отредактировал(а) demon051 - 20.12.2019, 12:53
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1579 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.