Прерывание для отправки и получения строки

Кто-нибудь может показать пример кода или ссылку, которая поможет мне решить эту проблему. Я хочу получать и передавать строку с помощью терминала.

до сих пор я получил только это ->

    void usart_init(void)
    {

        UBRRH = 0x00;
        UBRRL = 95;
        UCSRB =  (1 << RXEN) | (1 << TXEN) | **(1<<RXCIE)**; 
        UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0)|(1 << UCSZ1); 
    }

    ISR (USART_RXC_vect)
    {
    PORTD= 0b00000100;  //enable RTS
    char ReceivedByte ;
    ReceivedByte = UDR ; // Fetch the received byte value into the variable " ByteReceived "
    UDR = ReceivedByte ; // Echo back the received byte back to the computer
    PORTD= 0b00000000;  //disable RTS

    }
int main (void)
{
   usart_init();
   while(1)
    {
      sei();
    }
   return 0;
}

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

Спасибо за помощь:)

1 ответ

Решение

Этот вопрос связан с вашим другим вопросом. Из того, что я вижу, вы хотите перейти к подходу, основанному на прерываниях.

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

ReceivedByte = UDR

ты бы написал что-то вроде этого

_ReceiveBuffer[i++] = UDR

где _ReceiveBuffer может быть таким глобальным массивом

char _ReceiveBuffer[100];

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

Некоторые комментарии к вашему коду:

ISR (USART_RXC_vect) {
    PORTD= 0b00000100;  //enable RTS
    char ReceivedByte ;
    ReceivedByte = UDR ; // Fetch the received byte value into the variable " ByteReceived "
    UDR = ReceivedByte ; // Echo back the received byte back to the computer
    PORTD= 0b00000000;  //disable RTS
}

Вы не должны возвращать данные изнутри ISR или делать что-то отнимающее много времени, вы рискуете заблокировать ваш ISR. Хотя этот конкретный код будет работать, вы не ждете передачи данных, что не является хорошей практикой.
И вы уверены, что используете аппаратное подтверждение связи? В предыдущем посте это не выглядело так, поэтому вы можете удалить две строки, где переключается потенциальный сигнал RTS.

while(1) {
    sei();
}

Постоянно звонит sei() не имеет смысла. sei() включает глобальный флаг прерывания, достаточно сделать это один раз.

Я предлагаю прочитать некоторые руководства по C и AVR, так как вам не хватает базовых знаний.

Другие вопросы по тегам