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