реклама на сайте
подробности

 
 
> Простой вопрос про Nios II UART, почему теряет байты?
Reanimator++
сообщение Apr 27 2011, 15:56
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 399
Регистрация: 1-01-06
Из: Волгоград
Пользователь №: 12 763



Собственно, добрался до минимальной глючащей программы.

Код
#include "unistd.h"
#include "fcntl.h"
#include "stdio.h"
#include "system.h"
#include "sys/alt_irq.h"

int main (void)
{
    int  uart_descriptor;

    alt_u32 i, timer;
    alt_u8 command = 0x85;
    alt_u32 recieved;

    alt_irq_context  aaa;

    printf ("Vezuviy UART Test Program");

    uart_descriptor = open ("/dev/uart_board_0", O_RDWR|O_NONBLOCK|O_NOCTTY|O_SYNC);
    if (uart_descriptor)
    {
        printf ("Device_open success!\n");

        while (1)
        {
            timer = alt_nticks ();
            write (uart_descriptor, &command, 1);
            recieved = 0;


            while (alt_nticks() < (timer + 100) && (recieved != 95))
            {
                tmp = read (uart_descriptor, NULL, 1000);
                if (tmp > 0)
                    recieved += tmp;
            }

            printf ("%ld\n", recieved);

        }



    }
    else
        printf ("Device_open fail!\n");


}


Есть устройство, которое подключено к NIOS по UART, в ответ на команду запроса оно возвращает ответ - ровно 95 байтов (проверено, 100%).
А Nios почему-то иногда получает меньше. Теряется случайный байт в середине пакета, либо несколько байт подряд.

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

Код
        while (1)
        {
            timer = alt_nticks ();
            write (uart_descriptor, &command, 1);
            recieved = 0;


            while (alt_nticks() < (timer + 100) )
                   ;


            recieved = read (uart_descriptor, NULL, 1000);
            

            printf ("%ld\n", recieved);

        }



Зы, система простая, содержит несколько UART, один системный таймер, PIO и epcs_controller.
В BSP выбраны полные не уменьшенные быстрые драйвера для UART.. (работающие через прерывания)

Корявый драйвер не запрещает прерывания при чтении?
Или я что-то делаю не так?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Reanimator++   Простой вопрос про Nios II UART   Apr 27 2011, 15:56
- - vadimuzzz   Цитата(Reanimator++ @ Apr 27 2011, ...   Apr 28 2011, 02:40
- - Reanimator++   Нет, это не решение а синтетический тест ) Я напис...   Apr 28 2011, 05:43
|- - vadimuzzz   Цитата(Reanimator++ @ Apr 28 2011, ...   Apr 28 2011, 07:20
- - Reanimator++   Блокирующее не вариант, не дай бог байтик не дошел...   Apr 28 2011, 08:05
|- - vadimuzzz   Цитата(Reanimator++ @ Apr 28 2011, ...   Apr 28 2011, 08:11
- - Reanimator++   Упростил драйвер UART-а до четырех строчек, запрет...   Apr 28 2011, 10:47
|- - iosifk   Цитата(Reanimator++ @ Apr 28 2011, ...   Apr 28 2011, 10:52
- - Reanimator++   Дык сбой там или нет, зачем же прерывания-то тормо...   Apr 28 2011, 11:02
- - Reanimator++   Попробовал с железным RS-232 - все работает нормал...   Apr 28 2011, 14:26
|- - Serhiy_UA   Цитата(Reanimator++ @ Apr 28 2011, ...   Apr 29 2011, 05:27
- - Reanimator++   Продолжение.. После исключения JTAG UART и возврат...   Apr 28 2011, 16:00
|- - Stewart Little   Цитата(Reanimator++ @ Apr 28 2011, ...   Apr 28 2011, 16:06
- - Reanimator++   Пардон, ошибся, это был Standard - /s. А про VIC г...   Apr 28 2011, 16:14
|- - Stewart Little   Цитата(Reanimator++ @ Apr 28 2011, ...   Apr 28 2011, 16:23
- - Reanimator++   Спасибо за поддержку!   Apr 28 2011, 16:49
- - Fynjisx   Цитата(Reanimator++ @ Apr 27 2011, ...   Mar 4 2012, 09:42


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 21:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.0135 секунд с 7
ELECTRONIX ©2004-2016