-1

我知道关于这个功能的问题已经问了很多,但是在这里搜索了几个小时后,我找不到可以帮助我解决这个问题的答案。

这是通过我尝试实现的 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 字符数组,称为全局定义的标签。我想将 UART 数据接收到这个数组中。

这是我尝试使用它的方式。

UART_Read_Text(label,16);

有人可以阐明我做错了什么吗?请记住,我的 UART TX 功能运行良好,因此我已正确设置。另外,我试图不必使用中断,但也许这就是我必须走的路。任何帮助,将不胜感激。

4

2 回答 2

0

您是否尝试过使用调试器放置断点并单步执行您的代码?您还可以尝试打印 UART_Read() 的输出,以查看它是否在输出任何内容。

另外,删除

unsigned int i;

这是令人困惑的,因为它与后面的陈述相矛盾。也许编译器正在将 i 的初始化删除为 0,因为它在同一语句中将其声明为 int ?

于 2015-11-15T23:12:46.117 回答
0

我今晚开始工作了。我实际上最终使用了中断服务程序。我将发布它,希望它可以帮助其他人。

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

再次感谢所有试图提供帮助的人。它总是受到赞赏。

于 2015-11-18T05:33:08.820 回答