将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, ¶m1)){
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,蓝牙都只能在电脑上接受数据而无法在单片机上接收数据,发送数据是没有问题的,但单片机直接使用串口通信可以接受数据顺利执行代码