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

Ваш аккаунт

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

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

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

Проблемы с записью данных в порт, открытый с Hardware flow control

19K
17 октября 2006 года
NightSpider
8 / / 16.10.2006
Нужно ли выполнять
Соединил на своем компе (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);
            printf("\n");
        }
    }
}
19K
18 октября 2006 года
NightSpider
8 / / 16.10.2006
Кое-что раскопал, но до сих пор не понимаю, почему так происходит.
С одного порта в другой отправляю 3 блока данных: 6 байт, 256 байт, 2 байта.
Если выполнить подряд 3 отправки, а потом, чтение, то read прочтет только первый блок из 6 байт. Оставшиеся блоки (2) так и не придут, даже если потом много раз выполнять read.
НО если между отправками сделать паузу, вроде:
write блок 1 com1;
sleep(1); //задержка 1 секунда
write блок 2 com1;
write блок 3 com1;
read com2;

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

Почему такое происходит понять не могу. Есть у кого-нибудь соображения на этот счет прошу высказаться.
19K
19 октября 2006 года
NightSpider
8 / / 16.10.2006
Проблемы были из-за функции ioctl(handle,TCFLSH,2);
Т.к. функции write выполнялись очень быстро, блоки не успевали уйти из порта, а их уже убивали с помощью TCFLUSH следующего write.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог