Доброго вам времени суток

Подскажите пожалуйста, есть ли какие-нибудь особенности в смене бодрейта уарта, скажем так, на горячую?

То есть во время выполнения программы мне необходимо менять baudrate уарта. Так вот столкнулся с тем, что в буфере приемника нет никаких данных в то время, как их я вижу на осцилографе.

Конкретизируюsmile.gif

АРМ общается на скорости 28800 с модемом, затем в один прекрасный момент нужно поменять скорость на 115200. Меняю. Посылаю "привет" модему, тот как вежливый объект отвечаетsmile.gif Но в АРМе почему-то нет никакой информации.

Процедура инициализации уарта:
Код
void USART_init(unsigned int baudrate) {
    AT91C_BASE_US0->US_CR = AT91C_US_RSTRX |    
                            AT91C_US_RSTTX |            
                            AT91C_US_RXDIS |            
                            AT91C_US_TXDIS;            

    AT91F_PIO_CfgPeriph(
     AT91C_BASE_PIOA,  AT91C_PA0_RXD0 | AT91C_PA1_TXD0,
     0 );

    AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1<<AT91C_ID_US0);

    AT91C_BASE_US0->US_IER = AT91C_US_ENDRX | AT91C_US_RXRDY;

    AT91F_US_Configure (AT91C_BASE_US0,
                        MCK,
                        AT91C_US_ASYNC_MODE | AT91C_US_NBSTOP_2_BIT,
                        baudrate,
                        0);

    AT91C_BASE_US0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;

    AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
                          AT91C_ID_US0,
                          INTERRUPT_LEVEL_7,
                          AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
                          Usart0_c_irq_handler);

    AT91C_BASE_US0->US_RPR = (unsigned int)&buff_rx;
    AT91C_BASE_US0->US_RCR = 256;
    AT91C_BASE_US0->US_TCR = 0;

    AT91C_BASE_US0->US_RTOR = 10000;

    AT91F_PDC_Open(AT91C_BASE_PDC_US0);
    AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_US0);
}


Собственно, я попробовал просто вызвать в коде выше указанную процедуру с другим параметром baudrate

Код
. . . // Код общения с модемом на скорости 28800
  AT91C_BASE_US0->US_THR = 0x21;    
  sleep(100);
  AT91F_US_Put(AT91C_BASE_US0, baseAddress, 4);
  sleep(100);

  USART_init(115200);  // Пытаюсь поменять бодрейт

  sleep(100);
  AT91C_BASE_US0->US_THR = 0x21;    
  sleep(100);
  AT91C_BASE_US0->US_THR = 0x00;    // вот после этой посылки должно прийти 160 байт от модема, и они приходят, но в буфере buff_rx нет ничего.


Причем дальнейшая работа на 115200 вполне так может осуществляться... То есть, если модем присылает по одному байту, то в буфере они оказываются.

Подскажите пожалуйста, в чем особенность работы с переменным бодрейтом и приемом информации по нему?