【问题标题】:UART communication PIC16f877AUART通信PIC16f877A
【发布时间】:2014-09-07 12:53:36
【问题描述】:

我一直在做一个项目,该项目需要与我的笔记本电脑和微芯片 Pic 16f877a 通信,但通信无法正常工作,但是 当我将这个示例放在 Proteus 8 上时工作正常。
我的笔记本电脑上没有 RS232(串口),但我买了 TTL 模块。我在板上使用了 8MHz 的外部振荡器,波特率为 9600 bps。

当我连接笔记本电脑并向 TTL 模块发送 A 符号时,没有任何反应,当我发送几次 A 时,我很快收到了奇怪的符号,例如“?”或“#”返回。

这是图片的代码:

char x;
void main(){
  TRISB = 0x00;
  PORTB = 0x00;
  UART1_Init(9600);
  delay_ms(10);
while(1){
  if(UART1_Data_Ready())
  {
     x = UART1_Read();
     if(x == 'A')
     {
         PORTB = 0xFF;
         UART1_Write(13);
         UART1_Write_Text("A");
         UART1_Write(13);
     }
     else
     {
        PORTB = 0x00;
     }
  }
 x= '\0';
}
}

有人可以帮助我吗?有什么问题?

【问题讨论】:

  • 你可能会发生很多事情......比如硬件流控制错误的奇偶校验位等,不知道UART1_Write(13);是什么......真的很难得到这个无需逻辑分析仪或 O-Scope 即可工作的东西……尤其是您的第一次……
  • 同意 Grady,在使用微控制器时投资示波器。如果你有一台 PC,你基本上已经有一个可用的范围来调试串行 I/O,例如 UART - 你的声卡。谷歌在线了解如何将声卡用作示波器。我自己在 Linux 上使用 xoscope。
  • @GradyPlayer UART1_Write(13);只是发送一个回车。

标签: microcontroller pic uart microchip


【解决方案1】:

据我所知有两种可能性(假设 UART1_Init(9600); 是一个正确的库函数):

  1. 您没有将 Rx 引脚设置为输入;将 TRIS 寄存器设置为 0 会使该端口上的所有引脚输出。

  2. 您使用的奇偶校验不正确。

你有没有在行设置断点

x = UART1_Read();

要查看从终端程序发送时实际收到的内容?

您是否查看过示波器以了解 Rx 引脚上实际输入的内容?

delay_ms(10);完全没有必要。

【讨论】:

    【解决方案2】:

    给

    SPBRG = 139
    

    参考此link 设置相应的波特率发生器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-09
      • 2013-03-28
      • 2021-03-12
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      相关资源
      最近更新 更多