This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F6638: HC05蓝牙端口作从机无法在单片机上接收数据

Part Number: MSP430F6638

将HC05蓝牙模块连接到MSP430端口无法接收主机数据,但蓝牙从机连接到电脑上是可以接收到主机的数据的

从机端口代码:

#include "driverlib.h"
bool UART_Init(uint16_t baseAddress, uint32_t Baudrate)
{
    float UART_Temp = 0;
    USCI_A_UART_initParam huart = {0};

    if(baseAddress == USCI_A0_BASE)         //P3.3, P3.4 = USCI_A0 TXD/RXD
    {
        GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P3, GPIO_PIN3);
        GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P3, GPIO_PIN4);
    }
    else if(baseAddress == USCI_A1_BASE)    //P4.4, P4.5 = USCI_A1 TXD/RXD
    {
        GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P8, GPIO_PIN2);
        GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P8, GPIO_PIN3);
    }

    if(Baudrate <= 9600)
    {
        huart.selectClockSource = USCI_A_UART_CLOCKSOURCE_ACLK;
        UART_Temp = (float)UCS_getACLK()/Baudrate;
    }
    else
    {
        huart.selectClockSource = USCI_A_UART_CLOCKSOURCE_SMCLK;
        UART_Temp = (float)UCS_getSMCLK()/Baudrate;
    }

    if(UART_Temp < 16)
        huart.overSampling = USCI_A_UART_LOW_FREQUENCY_BAUDRATE_GENERATION;
    else
    {
        huart.overSampling = USCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;
        UART_Temp /= 16;
    }

    huart.clockPrescalar = (int)UART_Temp;

    if(huart.overSampling == USCI_A_UART_LOW_FREQUENCY_BAUDRATE_GENERATION)
    {
        huart.secondModReg = (int)((UART_Temp - huart.clockPrescalar) * 8);
    }
    else
    {
        huart.firstModReg = (int)((UART_Temp - huart.clockPrescalar) * 16);
    }

    huart.parity = USCI_A_UART_NO_PARITY;
    huart.msborLsbFirst = USCI_A_UART_LSB_FIRST;
    huart.numberofStopBits = USCI_A_UART_ONE_STOP_BIT;
    huart.uartMode = USCI_A_UART_MODE;

    if (STATUS_FAIL == USCI_A_UART_init(baseAddress, &huart))
    {
        return STATUS_FAIL;
    }

    //Enable UART module for operation
    USCI_A_UART_enable(baseAddress);

    //Enable Receive Interrupt
    USCI_A_UART_clearInterrupt(baseAddress, USCI_A_UART_RECEIVE_INTERRUPT);
    USCI_A_UART_enableInterrupt(baseAddress, USCI_A_UART_RECEIVE_INTERRUPT);

    return STATUS_SUCCESS;
}

从机MAIN:

#include <msp430.h> 
#include <msp430f6638.h>
#include "driverlib.h"
#include "clk.h"
#include "dr_lcdseg.h"   //调用段式液晶驱动头文件
/**
 * main.c
 */


int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	P4DIR |=BIT5+BIT6+BIT7;  //控制LED5、LED4、LED3的IO口P4.5、P4.6、P4.7设置为输出
	P5DIR |=BIT7;//控制LED2的IO口P5.7设置为输出
	P8DIR |=BIT0;//控制LED1的IO口P8.0设置为输出
	initLcdSeg();           //初始化段式液晶
	clk_Init ();
	UART_Init(USCI_A1_BASE, 9600);
	__bis_SR_register(GIE);
    while(1)
    {

	}
}

#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR (void)
{
    uint8_t receivedData = 0;
    switch (__even_in_range(UCA1IV,4))
    {
        //Vector 2 - RXIFG
        case 2:
            receivedData = USCI_A_UART_receiveData(USCI_A1_BASE);
            //USCI_A_UART_transmitData(USCI_A1_BASE,receivedData);

            P8OUT &=~BIT0;
            P5OUT &=~BIT7;
            P4OUT ^=BIT7;
            P4OUT ^=BIT6;
            P4OUT ^=BIT5;

            break;
        default:
            break;
    }
}

主机端口:

#include "driverlib.h"
#include"UART.h"
void UARTInit()
{
    GPIO_setAsPeripheralModuleFunctionInputPin(
        GPIO_PORT_P3,
        GPIO_PIN3+GPIO_PIN4
        );

    USCI_A_UART_initParam param1 = {0};
    param1.selectClockSource = USCI_A_UART_CLOCKSOURCE_SMCLK;
    param1.clockPrescalar = 52;
    param1.firstModReg = 1;
    param1.secondModReg = 0;
    param1.parity = USCI_A_UART_NO_PARITY;
    param1.msborLsbFirst = USCI_A_UART_LSB_FIRST;
    param1.numberofStopBits = USCI_A_UART_ONE_STOP_BIT;
    param1.uartMode = USCI_A_UART_MODE;
    param1.overSampling = USCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;

    if (STATUS_FAIL == USCI_A_UART_init(USCI_A0_BASE, &param1)){
        return;
    }
    USCI_A_UART_enable(USCI_A0_BASE);
}

void FS(unsigned char*write)                          //向串口写一个字符串
{
        while(*write!='\0')
        {
            USCI_A_UART_transmitData (USCI_A0_BASE,*write);
            __delay_cycles(5);
                write++;
        }
        USCI_A_UART_transmitData (USCI_A0_BASE,0x0d);
        USCI_A_UART_transmitData (USCI_A0_BASE,0x0a);
}
void FSNO(unsigned char*write)                          //向串口写一个字符串
{
        while(*write!='\0')
        {
            USCI_A_UART_transmitData (USCI_A0_BASE,*write);
            __delay_cycles(5);
                write++;
        }
}

void YS(int b)
{
    unsigned char a0[2]="0";
    unsigned char a1[2]="1";
    unsigned char a2[2]="2";
    unsigned char a3[2]="3";
    unsigned char a4[2]="4";
    unsigned char a5[2]="5";
    unsigned char a6[2]="6";
    unsigned char a7[2]="7";
    unsigned char a8[2]="8";
    unsigned char a9[2]="9";
    if(b==0)
    {
    FSNO(a0);
    }
    else if(b==1)
    {
    FSNO(a1);
    }
    else if(b==2)
    {
    FSNO(a2);
    }
    else if(b==3)
    {
    FSNO(a3);
    }
    else if(b==4)
    {
    FSNO(a4);
    }
    else if(b==5)
    {
    FSNO(a5);
    }
    else if(b==6)
    {
    FSNO(a6);
    }
    else if(b==7)
    {
    FSNO(a7);
    }
    else if(b==8)
    {
    FSNO(a8);
    }
    else if(b==9)
    {
    FSNO(a9);
    }

}




void HS(int a)
{

int b;
int c;
int e;
int f;
unsigned char sign[2]="-";
if(a>=0)
{
b= a%10;               //个位数
c= a/ 10 % 10;           //十位数
e= a/ 100 % 10;          //百位数
f= a/ 1000;              //千位数
if(f==0&&e==0&&c==0&&b!=0)
{
YS(b);
}
else if(f==0&&e==0&&c!=0)
{
YS(c);
YS(b);
}
else if(f==0&&e!=0)
{
 YS(e);
 YS(c);
 YS(b);
}
else if(f!=0)
{
    YS(f);
    YS(e);
    YS(c);
    YS(b);
}
}
else if(a<0)
{
a=-a;
b= a%10;               //个位数
c= a/ 10 % 10;           //十位数
e= a/ 100 % 10;          //百位数
f= a/ 1000;              //千位数
if(a<10)
{
FSNO(sign);
YS(b);
}
else if(f==0&&e==0&&c==0&&b!=0)
{
FSNO(sign);
YS(c);
YS(b);
}
else if(f==0&&e==0&&c!=0)
{
FSNO(sign);
 YS(e);
 YS(c);
 YS(b);
}
else if(f!=0)
{
    FSNO(sign);
    YS(f);
    YS(e);
    YS(c);
    YS(b);
}
















}

}

蓝牙配对成功,端口波特率均为9600,蓝牙都只能在电脑上接受数据而无法在单片机上接收数据,发送数据是没有问题的,但单片机直接使用串口通信可以接受数据顺利执行代码