PIC16的UART_Read_Text函数

时间:2015-11-15 21:47:24

标签: uart microchip usart

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

这是通过我试图实现的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功能运行良好,所以我已正确设置。此外,我试图不必使用中断,但也许这就是我必须要去的方式。任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:0)

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

另外,删除

unsigned int i;

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

答案 1 :(得分: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

再次感谢所有试图提供帮助的人。总是很感激。