UART_Read_Text функция для PIC16

Я знаю, что много вопросов задавали по этой функции, но после поисков в течение нескольких часов здесь я не могу найти ответ, который поможет мне понять это.

Вот функция для чтения в строке через UART, которую я пытаюсь реализовать.

void UART_Read_Text(char *Output, unsigned int length)
{
  unsigned int i;
  for(int i=0;i<length;i++)
  Output[i] = UART_Read();
}

У меня есть 16-символьный массив с именем label, определенный глобально. Я хочу получить данные UART в этот массив.

Вот как я пытаюсь это использовать.

UART_Read_Text(label,16);

Может кто-нибудь, пожалуйста, пролить свет на то, что я делаю неправильно? Имейте в виду, у меня хорошо работает функция UART TX, поэтому я правильно настроил ее. Кроме того, я стараюсь не использовать прерывания, но, возможно, именно так я и должен идти. Любая помощь будет оценена.

2 ответа

Вы пытались использовать отладчик для установки точки останова и перехода по своему коду? Вы также можете попробовать распечатать вывод UART_Read(), чтобы увидеть, выводит ли он вообще что-либо.

Кроме того, удалить

unsigned int i;

Это сбивает с толку, поскольку противоречит утверждению после него. Может быть, компилятор удаляет инициализацию i в 0, поскольку он объявляет его как int в том же выражении?

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

void interrupt ISR() 
{
    if (PIR1bits.RCIF)          // see if interrupt caused by incoming data
    {
        UART_Read_Text(Output,16); //replace "Output" with the array that you want populated.
        PIR1bits.RCIF = 0;      // clear interrupt flag
    }
}

Кроме того, эти версии функций работают нормально. Хотя, есть некоторая очистка, чтобы сделать, это должно кого-то начать.

char UART_Read()
{
  while(!RCIF);
  return RCREG;
}

void UART_Read_Text(char *Output, unsigned int length)
{
  unsigned int i;
  for(int i=0;i<length;i++)
  Output[i] = UART_Read();
}

Я отдаю должное автору по следующей ссылке. Я нашел полезную информацию в этом коде. Обязательно установите все биты, которые управляют прерыванием. Их также можно найти по следующей ссылке.

https://gist.github.com/gshrikant/8549474

Но вот они:

    RCIF=0;   // make sure receive interrupt flag is clear
    RCIE=1;   // enable UART Receive interrupt, 1 to enable
    PEIE = 1; // Enable Peripheral interrupts //WAS ORIGINALLY 1
    GIE = 1;  // Enable global interrupts

Еще раз спасибо всем, кто пытался помочь. Это всегда ценится.

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