pic16f877a通用异步收发器嵌入式c代码

pic16f877a通用异步收发器嵌入式c代码,c,embedded,pic,microchip,C,Embedded,Pic,Microchip,我已经为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) {

我已经为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");
}
while循环中的语句没有意义:

while(*q) {
   *(*q++);
}
这将导致出现错误:981所需指针错误,因为您正在解引用非指针:*q++返回一个字符,因此您试图用外部*解引用一个字符

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

也可以这样写

while(*q) {
    tx(*q++);
}
这样,您的代码可以用xc8编译,但我还没有验证您的SFR设置-如果代码不起作用,请仔细检查您是否正确设置了SFR。有关更多信息,请参阅@LPs提供的链接:

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

while(*q) {
   *(*q++);
}
这将导致出现错误:981所需指针错误,因为您正在解引用非指针:*q++返回一个字符,因此您试图用外部*解引用一个字符

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

也可以这样写

while(*q) {
    tx(*q++);
}
这样,您的代码可以用xc8编译,但我还没有验证您的SFR设置-如果代码不起作用,请仔细检查您是否正确设置了SFR。有关更多信息,请参见@LPs提供的链接:

在表达式中:

*(*q++) ;
取消对指针的引用以获取一个字符,然后再次取消对该字符的引用*;但不能取消对非指针的引用

除此之外,您可能还打算在uart_字符串中调用tx,以便它执行任何有用的操作。

在表达式中:

*(*q++) ;
取消对指针的引用以获取一个字符,然后再次取消对该字符的引用*;但不能取消对非指针的引用


除此之外,您可能还打算在uart_字符串中调用tx,以便它执行任何有用的操作。

请查看。至少你必须设置波特率来做你想做的事情。一点小费。尝试短切TX和RX引脚并开始使其工作。要将它连接到PC,您至少还需要一根usb到TTL UART 5V电缆。如果您的编译器发出诊断消息,您应该在问题中包含确切的消息,并准确指出消息是在哪一行发出的。@LPs:带有旧串行端口的PC仍然可用。尽管需要一个232线驱动器。如果他的电脑默认安装了超级终端,那么它一定很旧,而且在任何情况下都可能有232个端口。@Clifford我的意思是,OP可以将PIC直接连接到电脑,而不使用至少一个MAX232。我建议使用USB到TTL电缆直接连接到TX和RX引脚,可能在带有PIC PDIP包的试验板测试电路上。当我们将SPBRG值设置为15时,buad速率值为9600,晶体频率为10MhZ,如数据表所示。请回复我,先生。查看。至少你必须设置波特率来做你想做的事情。一点小费。尝试短切TX和RX引脚并开始使其工作。要将它连接到PC,您至少还需要一根usb到TTL UART 5V电缆。如果您的编译器发出诊断消息,您应该在问题中包含确切的消息,并准确指出消息是在哪一行发出的。@LPs:带有旧串行端口的PC仍然可用。尽管需要一个232线驱动器。如果他的电脑默认安装了超级终端,那么它一定很旧,而且在任何情况下都可能有232个端口。@Clifford我的意思是,OP可以将PIC直接连接到电脑,而不使用至少一个MAX232。我建议使用USB到TTL电缆直接连接到TX和RX引脚,可能在带有PIC PDIP包的试验板测试电路上。当我们将SPBRG值设置为15时,buad速率值为9600,晶体频率为10MhZ,如数据表所示。请回复我,先生。谢谢。我已经编译了代码,没有错误。我将在proteous中进行检查,然后返回给您,先生谢谢。我已经编译了代码,没有错误。我会在Proteopus中进行检查,然后返回给您,先生