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
Еще раз спасибо всем, кто пытался помочь. Это всегда ценится.