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