Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: использование управления потоком FT232BM
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
showone
устройство на контроллере подключается через 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
Цитата(showone @ May 11 2007, 09:22) *
поэтому если кидать данные без управления потоком, они теряются.
если с управлением потока, то вроде все нормально. но иногда все же теряется 1-4 байта.

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

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

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

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

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

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

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

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

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


Почитайте
http://electronix.ru/forum/index.php?showt...amp;hl=AlexBoss
и удачи Вам!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.