Код
#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");
}
#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);
}
{
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.. (работающие через прерывания)
Корявый драйвер не запрещает прерывания при чтении?
Или я что-то делаю не так?