устройство на контроллере подключается через 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 байт переданы и можно передавать следующие ?
пробовал передавать по одному байту, тоже теряются байты.
может есть где пример как правильно, или кто что может посоветует.
заранее спасибо.