The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Проблемы с записью данных в порт, открытый с Hardware flow c..."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Проблемы с записью данных в порт, открытый с Hardware flow c..."  
Сообщение от NightSpider email(ok) on 17-Окт-06, 16:52 
Нужно ли выполнять
Соединил на своем компе (Linux) ttyS0 и ttyS1 нуль модемным кабелем, открыл оба порта с Hardware flow control в режиме передачи бинарных данных. Написал две маленькие функци: одна отправляет 3 блока данных в порт ttyS0, вторая получает данные из ttyS1 и выводит на экран.
В программе вызвал две эти функции последовательно. По идее, ода функция должна отправить 3 блока данных в порт, вторая получить весь этот блок (из 3 маленьких блоков) и вывести на экран. Но почему-то на экран выводится только первый блок данных (из трех), остальные два функция так и не получает. В чем может быть проблема?

Функция открытия порта

//---------------------------------------------------------------------------

int  TComPortFunctions::OpenPort()
{
    struct termios options;
    printf("Bus System communication device name: %s\n",devicename) ;
    printf("Befor open: handle = %d\n",handle) ;
    if(handle != -1) return -1; // Порт уже открыт нашей программой
    /* open the port */
    handle = open(devicename, O_RDWR | O_NOCTTY| O_NDELAY);
    printf("After open: handle = %d\n",handle) ;
    if(handle < 0) return -2; // Какая-то другая проблема
    
    fcntl(handle, F_SETFL, 0);

    /* get the current options */
    tcgetattr(handle, &options);
    /* Устанавливаем скорость приема и предачи */
    cfsetispeed(&options, B9600); // Установили скорость приема сообщений
    cfsetospeed(&options, B9600); // Установили скорость отправки сообщений
    
    options.c_cflag |= (CLOCAL | CREAD);

    //No parity (8N1)
    options.c_cflag    &=~PARENB;    
    options.c_cflag    &=~CSTOPB;            
    options.c_cflag    &=~CSIZE;    
    options.c_cflag    |=CS8;
    
    //Установить режим RAW
    cfmakeraw(&options);
    
    // Убираем флаг замены ВХОДЯЩИХ символов 10 и 13
    options.c_iflag &=~ICRNL;
    options.c_iflag &=~INLCR;

    //Установка аппаратного контроля передачи данных
    options.c_cflag |=CRTSCTS;
    options.c_iflag &=~(IXON|IXOFF|IXANY);

    
    options.c_cc[VMIN]  =0; // Минимальное количество символов для чтения
    options.c_cc[VTIME] =timeout; //Время ожидания

    /* set the options */
    tcsetattr(handle, TCSANOW, &options);
    ioctl(handle,TCFLSH,2); // Сбарываем очереди ввода вывода
    return 0;
}


функция записи в порт

long TComPortFunctions::WriteBlockWithoutAnswer(unsigned char* block_to)
{

    ioctl(handle,TCFLSH,2); // сбрасываем очереди ввода вывода
    if (write(handle, block_to, block_len)!=block_len)
        return -2;
return 0;    
}


функция чтения из порта

//---------------------------------------------------------------------------
void TComPortFunctions::ReadToScreen()
{

    unsigned char block_from[264];
    int block_len=264;
    int block_len_from=1;


    while (block_len_from!=0)
    {
        block_len_from=read(handle, &block_from[0], block_len);
        if (block_len_from>0)
        {
            printf("Resutlt:");
            for(int i=0;i<block_len_from;i++)
                printf(" %d",block_from[i]);
            printf("\n");
        }
    }
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Проблемы с записью данных в порт, открытый с Hardware flow c..."  
Сообщение от NightSpider email(ok) on 18-Окт-06, 23:24 
Кое-что раскопал, но до сих пор не понимаю, почему так происходит.
С одного порта в другой отправляю 3 блока данных: 6 байт, 256 байт, 2 байта.
Если выполнить подряд 3 отправки, а потом, чтение, то read прочтет только первый блок из 6 байт. Оставшиеся блоки (2) так и не придут, даже если потом много раз выполнять read.
НО если между отправками сделать паузу, вроде:
write блок 1 com1;
sleep(1); //задержка 1 секунда
write блок 2 com1;
write блок 3 com1;
read com2;

ТО read читает абсолютно все данные, как и положено, без проблем.

Почему такое происходит понять не могу. Есть у кого-нибудь соображения на этот счет прошу высказаться.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Проблемы с записью данных в порт, открытый с Hardware flow c..."  
Сообщение от DeadMustdie email(??) on 19-Окт-06, 09:20 
Ответ: буферизация.
Уточнение: порт нужно опрашивать на предмет наличия в нем данных.
При появлении таковых - читать. Если пытаться читать, не дожидаясь
появления данных, может оказаться, что читать-то еще нечего.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Проблемы с записью данных в порт, открытый с Hardware flow c..."  
Сообщение от NightSpider email(ok) on 19-Окт-06, 12:59 
Проблемы были из-за функции ioctl(handle,TCFLSH,2);
Т.к. функции write  выполнялись очень быстро, блоки не успевали уйти из порта, а их уже убивали с помощью TCFLUSH следующего write.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2023 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру