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

 
 
> использование управления потоком FT232BM, помогите разобраться
showone
сообщение May 11 2007, 11:37
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 15-07-05
Пользователь №: 6 832



устройство на контроллере подключается через FT232BM к USB.
задача периодически пополнять внутренний буфер контроллера.
контроллер управляет медленным устройством.

поэтому если кидать данные без управления потоком, они теряются.
если с управлением потока, то вроде все нормально. но иногда все же теряется 1-4 байта.

использую DSR-DTR

делаю так.
в микроконтроллере.

interrupt [USART_RXC] void usart_rx_isr(void)
{
char status;
DSR=1;
status=UCSRA;
rx_d=UDR;
rx_b=1;
//DSR=0;
}

main()
{
while(1)
{
if (rx_b)
{
rx_b=0;
get_ser();
}
}
}

void get_ser(void)
{
// обрабатываю полученный байт, заполнение буфера
delay_ms(500); // задержка, вроде как устройство занято. если эту задержку убрать, то вроде как работает, но с ней, байты теряются, из 20 посланных 1-2 теряются.
DSR=0;
}


на Delphi


procedure wait_tx;
begin
repeat
Get_USB_Device_ModemStatus;
Application.ProcessMessages;
until (FT_Modem_Status and $00000020) = $00000020;
end;


..........................



if Open_USB_Device<>FT_OK then begin exit; end;
Reset_USB_Device;
FT_Current_Baud:=FT_BAUD_38400;
Set_USB_Device_BaudRate;

FT_Current_FlowControl:=FT_FLOW_DTR_DSR;
FT_XON_Value:=0;
FT_XOFF_Value:=0;
if Set_USB_Device_FlowControl<>FT_OK then showmessage('Set_USB_Device_FlowControl');

Purge_USB_Device_Out;
Purge_USB_Device_IN;


...............

for i:=1 to n do
begin
for j:=0 to 100 do FT_Out_Buffer[j]:=mas[j];
wait_tx; // ждем разрешения DSR
Write_USB_Device_Buffer(100);
end;



т.е. я выдаю в порт по 100 байт.
как мне точно узнать что все 100 байт переданы и можно передавать следующие ?


пробовал передавать по одному байту, тоже теряются байты.


может есть где пример как правильно, или кто что может посоветует.
заранее спасибо.



==========================================================

ответ zltigo
Я все исходники написанные Вами не читал, но:
1. Контроллер после выставления им неготовности обязан принять как минимум один байт
2. Нарезка на байты/порции со стороны PC - побайтовая передача с flush после каждого байта/порции.

==========================================================




есть ли где информация как построен сам процес управления потоком?
а то велосипед изобретать как-то не очень получается :-)

или где можно почитать про это.

меня интересует. точнее нужно.

есть боьшой масив данных, его нужно передать в контроллер порциями (размером с буфер контроллера 100 байт)
причем контроллер может в любой момент замереть в ожидании события почти на две секунды.

так вот.
управление потоком немного облегчило жизнь, при использовании DTR DSR.
но программа на дельфи, которая выкидывает по 100 байт, не может толком понять, кидать ей следующие 100 байт или нет.

или лучше кидать по одному байту постоянно, и ждать пока он не дойдет до контроллера и контроллер не разрешит дальнейший обмен.
но тогда получается что это уже програмный контроль, а не аппаратный.

может есть гре пример нормальной работы или алгаритма работы.

заранее спасибо.

Сообщение отредактировал showone - May 11 2007, 11:39
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Dog Pawlowa
сообщение May 11 2007, 16:44
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(showone @ May 11 2007, 14:37) *
задача периодически пополнять внутренний буфер контроллера.
контроллер управляет медленным устройством.

Эти два пункта не означают, что нужен флоу-контроль, скорее наоборот. Пока медленное устройство медленно шевелится, контроллер может принимать данные от компьютера в фоне, и укладывать их в буфер. С помощью прерываний можно организовать тучу процессов.
Поэтому что-то тут с мотивировками не в порядке.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
showone
сообщение May 11 2007, 20:28
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 15-07-05
Пользователь №: 6 832



Цитата(Dog Pawlowa @ May 11 2007, 20:44) *
Эти два пункта не означают, что нужен флоу-контроль, скорее наоборот. Пока медленное устройство медленно шевелится, контроллер может принимать данные от компьютера в фоне, и укладывать их в буфер. С помощью прерываний можно организовать тучу процессов.
Поэтому что-то тут с мотивировками не в порядке.


получается такая фигня.
контроллер заполняет в фоне буфер, но в какой-то момент работы с устройством, получает по прерыванию от УАРТ байт, не успевает его обработать, получает следующий байт и этот второй байт теряется.

вот и хотелось сделать так, чтобы второй байт не отсылался из компа или буфера FTDI, пока не будет полностью обработан первый. т.е. управление потоком как я понимаю нужно.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение May 12 2007, 07:14
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(showone @ May 11 2007, 23:28) *
получается такая фигня.
контроллер заполняет в фоне буфер, но в какой-то момент работы с устройством, получает по прерыванию от УАРТ байт, не успевает его обработать, получает следующий байт и этот второй байт теряется.

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

А зачем байты обрабатывать? Положить в буфер и все. Мне трудно представить, как можно потерять байты.
Вот тут мой примерчик прерывания по приему для того, чтобы положить байты в буфер
http://electronix.ru/forum/index.php?showtopic=31415

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

Вообще-то теперь, с ростом производительности контроллеров, при непосредственном подключении двух устройств (то есть без модемов), контроль потока не используется, как правило, и Вы двигаетесь в сторону, противоположную техническому прогрессу.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 12 2007, 08:41
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Dog Pawlowa @ May 12 2007, 10:14) *
А зачем байты обрабатывать? Положить в буфер и все. Мне трудно представить, как можно потерять байты.


Потерять байт элементарно, хотя управление потоком здесь не при чём. Так например в моём нынешнем устройстве есть объёмное прерывание. Его нельзя отложить и разбить на части. Так вот это прерывание не должно превышать длительность прихода двух байт в AVR. Иначе произойдёт потеря. При скорости 115200 2 байта это всего лишь 173.6 мкс. На 14745600 это 2560 тактов. Не так и много если требуется математика к примеру.

На lpc, я уже посмотрел, имеется аппаратный буфер на 16 байт. Это хорошо.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 12 2007, 10:31
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(SasaVitebsk @ May 12 2007, 11:41) *
Так например в моём нынешнем устройстве есть объёмное прерывание. Его нельзя отложить и разбить на части. Так вот это прерывание не должно превышать длительность прихода двух байт в AVR. Иначе произойдёт потеря.
У меня тоже есть такое прерывание. В нем я разрешаю вложенные. Точнее, вложенные я разрешаю во всех прерываниях (среди них одно длинное) кроме одного, которое терять нельзя и которое выполняется 90-115 тактов при периоде следования 128 тактов.
Цитата(SasaVitebsk @ May 12 2007, 11:41) *
На lpc, я уже посмотрел, имеется аппаратный буфер на 16 байт. Это хорошо.
Тогда глянь еще на AT91SAM7, там DMA позволяет сделать аппаратный буфер на все ОЗУ smile.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 19:34
Рейтинг@Mail.ru


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