Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Чтение из последовательного порта. не могу понять алгоритм работы функции read

56K
19 января 2010 года
vanessa
3 / / 19.01.2010
вообщем оно читает по 8 байт за раз даже если я просил больше. а если прошу меньше то некоторые байты теряются. как-то можна перенастроить чтоб читало сколько попрошу?
вот как открываю и настраиваю порт
Код:
int open_port(char *portName, int baudRate, int timeout)
        {

        struct termios options;
        int fport;

        fport = open(portName, O_RDWR | O_NOCTTY | O_NDELAY);

        if(fport!=-1)
        {
            if(tcgetattr(fport, &options)==0)
            {
                cfmakeraw(&options);
                cfsetspeed(&options, B19200);
                options.c_cflag |= (CLOCAL | CREAD  /*| CRTSCTS*/);
                options.c_cc[VMIN]=0;
                options.c_cc[VTIME]=timeout;

                if(tcsetattr(fport, TCSANOW, &options)!=0)
                {
                    close(fport);
                    fport=-1;
                }
                    fcntl(fport, F_SETFL,0);
            }
            else
            {
                close(fport);
                (fport)=-1;
            }

        }

        return fport;
        }
252
21 января 2010 года
koderAlex
1.4K / / 07.09.2005
а при чём здесь алгоритм ? порт не может выдать больше байт чем вы в него физически вводите . если запрошено больше чем есть , то выдается сколько есть . а если запрошено меньше , то данные обрезаются .
56K
21 января 2010 года
vanessa
3 / / 19.01.2010
Это понятно что порт не может выдать больше байт,мало того, некоторые байты по дороге могут потерятся или ответа вообще не будет если устройство выключено. Но я не про то хочу спросить. у меня ж режим вопрос-ответ, если я между write и read вставляю usleep с временем которого заведомо достаточно для того чтобы пришли все байты ответа я все-равно за раз не могу прочитать их все. и вообще, с usleep и неблокированным чтением я вообще не получаю ни одного байта.....
вообщем какое-то странное поведение, потому и спрашиваю.
252
21 января 2010 года
koderAlex
1.4K / / 07.09.2005
физический размер буфера последовательного порта всего 12 байт - нельзя посылать больше . сам порт - не разделяемый ресурс и потому вся работа должна быть с блокировками . драйвер порта об этом знает и потому не выдает ничего .
56K
21 января 2010 года
vanessa
3 / / 19.01.2010
12 байт - это тот буфер что в микросхеме? а операционная система при работе с этой микросхемой не переписывает данные в ОЗУ когда буфер заполняется. А как тогда принимать большие обьемы данных? И соответственно если они копируются в ОЗУ то тогда наверное можно выполнять неблокированное чтение ?

И еще добавлю что тот-же код только с заменой write на WriteFile, read на ReadFile и заменой соответствующих функций открытия и настройки порта под виндой работает без всяких танцев с бубном.
252
22 января 2010 года
koderAlex
1.4K / / 07.09.2005
WriteFile и ReadFile работают с виртуальным блочным устройством .
"А как тогда принимать большие обьемы данных?" - ответ очевиден . куча маленьких операций по 12 байт )
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог