UART在pic18上发送了错误的字符

时间:2018-03-05 17:22:27

标签: send pic uart

我试图通过调用funktion简单地通过我的UART接口发送字符:UART_Write_Text("hello");

这是在uart.c文件中执行的代码:

void UART_Init(void)
{
    //115200bps deafult value for RN4678
    BRGH = 0;                       //Setting High Baud Rat
    BRG16 = 0;                      //8-Bit mode
    SPBRG = 8;                      //Writing SPBRG Register
    TXSTAbits.SYNC = 0;             //Setting Asynchronous Mode, ie UART
    RCSTAbits.SPEN = 1;             //Enables Serial Port
    RCSTAbits.CREN = 1;             //Enables Reception
    TXSTAbits.TXEN = 1;             //Enables Transmission
}

/******************************************************************************/
//-----UART write byte
/******************************************************************************/
void UART_Write(char data)
{
    while(!TRMT);
    TXREG = data;
}

/******************************************************************************/
//-----UART check tx queue
/******************************************************************************/
char UART_TX_Empty(void)
{
    return TRMT;
}

/******************************************************************************/
//-----UART write string
/******************************************************************************/
void UART_Write_Text(char *text)
{
  for(int i=0; text[i]!='\0' || text[i] !=0x00; i++){
    UART_Write(text[i]);
  }
  UART_Write('\n');
}

/******************************************************************************/
//-----UART data ready to read
/******************************************************************************/
char UART_Data_Ready(void)
{
  return RCIF;
}

/******************************************************************************/
//-----UART read byte
/******************************************************************************/
char UART_Read(void)
{
  while(!RCIF);
  return RCREG;
}

/******************************************************************************/
//-----UART read string
/******************************************************************************/
void UART_Read_Text(char *Output, unsigned int length)
{
  unsigned int i;
  for(int i=0;i<length;i++)
  Output[i] = UART_Read();
}

现在当我调试它时,我看到它将wright charakters写入TXREG。最后它发出了以下字符:'h','e','l','l','o','\ n'。 我将它们发送到蓝牙模块RN4678,波特率为115200bps,这也是BT模块的默认波特率。然而,当我用蓝牙终端读取手机上的发送字符时,我只得到一些字符,而其他字符是问号,所以它不识别它们(并不总是识别出相同的字符)。

我已经尝试过波特率,但它看起来像是我写入SPBRG的正确值。 我也在轮询TRMT,所以不应该有任何碰撞......

有人知道我做错了吗?

1 个答案:

答案 0 :(得分:0)

#include "Configuration_bits.h"
#include <xc.h>
#include <stdio.h>
#include <p18f67k22.h>
#include <string.h>
#include <stdlib.h>
#define _XTAL_FREQ 16000000

void UART_Init_1(){  
    TRISCbits.TRISC6=1;  // TX1 Pin-31
    TRISCbits.TRISC7=1; //  RX1 Pin-32
    RC1IE=1;

    SPBRG1=34;                // Baud Rate 115200
    BAUDCON1bits.BRG16=1;
    TXSTA1bits.BRGH=1;


   //TXSTA 1 Register 
    TXSTA1bits.TX9=0;    // 8-bit transmission
    TXSTA1bits.TXEN=0;
    TXSTA1bits.TXEN=1;  // Transmit is enabled
    TXSTA1bits.SYNC=0;  // Asynchronous mode
    TXSTA1bits.TRMT=1;  // Transmit Shift Register Status bit

   //RXSTA 1 Register
    RCSTA1bits.SPEN=1;   // Serial Port Enable bit
    RCSTA1bits.RX9=0;    // 8-bit reception
    RCSTA1bits.CREN=1;   // Continuous Receive Enable bit

}  
void UART_Tx_1(unsigned char z[])
{
unsigned int uart_tx1=0;
while(z[uart_tx1]!='\0')
{
  while(!TX1IF);
  TXREG1=z[uart_tx1];
  uart_tx1++;
}
}
void UART_Rx_1()
{
    string_rx1[uart_rx1]=RCREG1;
    uart_rx1++;
}

void interrupt ISR(void)
{
     if(RC1IF && RC1IE)  // UART_1
        {     

        }



}
void main(void)
{ 
    System_Initialization();
    UART_Init_1();


     while(1) 
   {   

     UART_Tx_1("HELLO\r\n"); // Transmit Hello

   }
}