【问题标题】:pic16f877a uart embedded c codepic16f877a uart嵌入式c代码
【发布时间】:2016-04-08 05:08:33
【问题描述】:

我为 PIC16F877A 编写了 UART 代码。代码不工作,它显示一个错误,如 MP LAB IDE 所需的指针。我想向 PC 超级终端发送和接收字符。

#include<pic.h>

void pic_init(void)
{
   TRISC7=1;
   TRISC6=0;
}

void uart_init(void)
{
   TXSTA=0x20;
   RCSTA=0x90;
   SPBRG=15;
}

void tx(unsigned char byte)
{
   int i;
   TXREG=byte;
   while(!TXIF);
   for(i=0;i<400;i++);
}

void string_uart(char *q)
{
   while(*q)
   {
      *(*q++);
   }
}

unsigned char rx()
{
   while(!RCIF);
   return RCREG;
}

void main()
{
   char *q;
   pic_init();
   uart_init();
   tx('N');
   rx();
   string_uart("test program");
}

【问题讨论】:

  • 看看this guide。至少你必须设置波特率来做你想做的事。一个小提示。尝试短接 TX 和 RX 引脚并开始使其工作。要将其连接到 PC,您至少还需要一根 USB 转 TTL UART (5V) 电缆。
  • 如果您的编译器发出诊断消息,您应该在问题中包含确切的消息,并准确指出该消息是在哪一行发出的。
  • @LPs:具有传统串行端口的 PC 仍然可用。尽管随后将需要 232 线驱动器。如果他的电脑默认安装了超级终端,那它一定很老了,无论如何可能有 232 个端口。
  • @Clifford 我的意思是 OP 不能在不使用 MAX232 的情况下直接将 PIC 连接到 PC。我建议使用 USB 转 TTL 电缆直接连接到 TX 和 RX 引脚,可能在带有 PIC PDIP 封装的面包板测试电路上。
  • 当我们设置 SPBRG 值为 15 时,buad rate 值为 9600,晶振频率为 10MhZ,根据数据表。请回复我先生。

标签: c embedded pic microchip


【解决方案1】:

while 循环中的语句没有意义:

while(*q) {
   *(*q++);
}

这会导致您遇到 error: (981) pointer required 错误,因为您要取消引用非指针:*q++ 返回 char,因此您尝试使用外部 * 取消引用 char

相反,您可能希望传输指针当前指向的字符 (*q),然后递增指针 (q++):

while(*q) {
    tx(*q);
    q++;
}

这也可以写成

while(*q) {
    tx(*q++);
}

这样,您的代码编译(使用 xc8),但我尚未验证您的 SFR 设置 - 如果代码不工作,请仔细检查您已正确设置 SFR。更多信息请参见@LPs 提供的链接:https://electrosome.com/uart-pic-microcontroller-mplab-xc8/

【讨论】:

  • 谢谢。我已经编译了代码,没有错误。我会检查 proteous 并回来找你先生。 ——
【解决方案2】:

在表达式中:

*(*q++) ;

您取消引用指针以获取一个字符,然后再次取消引用 (*);但你不能取消引用非指针。

除此之外,您可能还打算在uart_string() 中调用tx(),让它做任何有用的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2015-09-28
    相关资源
    最近更新 更多