USART biblioteki w C

Mar 12, 2006 4 Replies

Witam!



Piszê w zwi±zku z moim w±tkiem na temat problemów z USART'em. Mo¿e w takim razie kto¶ zna jakie¶ gotowe funkcje z obs³ug± linii CTS/RTS ??



G³ównie chodzi mi tu o liniê CTS, która wstrzymywa³aby transmisjê z komputera, je¶li bym sobie tego za¿yczy³.



Witam ponownie!

Czy kto¶ wie jak zachowuje siê uk³ad FTDI232BM przy sprzêtowym sterowaniu przep³ywem? Mam nastêpuj±ce funkcje obs³ugi UARTA. W momencie, gdy wysy³am bajt po bajcie z terminala, wszystko jest OK. Gorzej jest, je¶li próbujê wys³aæ ca³y plik. Gdy ma on do 1k objêto¶ci wszystko wydaje siê w porz±dku. Jednak nie do koñca bo terminal odbiera to co przed chwil± wys³a³ dopiero po wys³aniu ca³ego pliku. W momencie gdy próbujê wys³aæ i odebraæ 10k plik - terminal odbiera tylko mniej wiêcej po³owê danych. Widzê wiêc, ¿e problem polega chyba na tym, ¿e terminal nie mo¿e jednocze¶nie nadawaæ i odbieraæ.

Dodam, ¿e nie sterujê lini± RTS, tylko sam± CTS no i u¿ywam chipu FTDI. Nie jestem pewien czy bez niego bêdzie dziaæ siê tak samo.

To co chcê uzyskaæ to wstrzymywanie transmisji z komputera, zanim obrobiê dane odebrane w procku. Pomys³ swój opieram na projekcie z Elektroniki Praktycznej 3/2005 (modem bezprzewodowy), gdzie rozwi±zano to w taki sam sposób. Niestety nie mam kodu ¼ród³owego do tego projektu i nie wiem jak dok³adnie to rozwi±zano.

Bêdê baaaardzo wdziêczny za pomoc!!!!!!

//------------------------------------------------------- SIGNAL (SIG_UART_DATA) { if(USART_nadajnik.wsk>=USART_nadajnik.ilosc_danych) { USART_TX_OFF; USART_nadajnik.zajety=0; } else { UDR=USART_nadajnik.buf[USART_nadajnik.wsk]; USART_nadajnik.wsk++; } } //-------------------------------------------------------

//------------------------------------------------------- SIGNAL (SIG_UART_RECV) { USART_odbiornik.buf[USART_odbiornik.wsk]=UDR;

USART_odbiornik.wsk++;

if(USART_odbiornik.wsk>USART_RX_buf_stop) { PORTB|=(1<<CTS); USART_odbiornik.buf_full=1; } } //-------------------------------------------------------

//------------------------------------------------------- while(1) {

if(USART_odbiornik.buf_full) { delay_ms(100); USART_odbiornik.buf_full=0; for(test1=0;test1<USART_odbiornik.wsk;test1++) { USART_nadajnik.buf[test1]=USART_odbiornik.buf[test1]; } USART_nadajnik.ilosc_danych=USART_odbiornik.wsk; USART_nadajnik.zajety=1; USART_nadajnik.wsk=0; USART_TX_ON; PORTB|=(1<<RTS); while(USART_nadajnik.zajety) { }

USART_TX_ON; USART_odbiornik.wsk=0; PORTB&=~(1<<CTS); }

} //-------------------------------------------------------

Krzysztof napisał(a):

Gdy zablokujesz nadawanie danych, z peceta przychodzi jeszcze od kilku do kilkunastu znaków. Musisz być na to przygotowany i już.

Zmień terminal. Chyba musisz korzystać z badziewnego HyperTerminala aby otrzymywać takie wyniki.

U¿ytkownik "Adam Dybkowski" snipped-for-privacy@amwaw.edu.pl> napisa³ w wiadomo¶ci news:dv1sds$mhn$ snipped-for-privacy@nemesis.news.tpi.pl...

Pamiêtam o tym!

Sprawdza³em ju¿ kilka - to samo!

Krzysztof napisał(a):

No to czas napisać swój własny. :) Na start proponuję przejrzenie kodu źródłowego TeraTerm'a - jest tego trochę.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required