MS51FB9AE işlemciyi HM-10 bluetooth modülü ile kullanmaya çalışıyorum. İşlemci 8-bit 8051 mimarili bir işlemci. Telefonuma Serial Bluetooth Terminal indirdim. Bu terminal üzerinden AT komutları atıyorum. Fakat şöyle bir sorunum var. Örneğin AT+BAUD? yazıyorsam uart interruptının içindeki printf kodu alınan karakterleri AT şeklinde gösteriyor. Geri kalanını alamıyorum gibi. Sadece atıyorum 'A' karakteri geldiyse led yak gibi işlemleri yapabildim.
Kodum bu while içinde 1 saniyede 1 led yakıyorum ve AT komutunu UART1 üzerinden gönderiyorum. 8051 mimari ile hiç çalışmadım daha önce bu yüzden şu an sorunun ne olduğunu anlayamıyorum bile. Daha önce bu mimari ile çalışmış varsa problemi söyleyebilir mi acaba?
Burada art arda telefondan işlemciye AT+BAUD? stringi gönderiyorum.
C:
/*---------------------------------------------------------------------------------------------------------*/
/* */
/* SPDX-License-Identifier: Apache-2.0 */
/* Copyright(c) 2020 Nuvoton Technology Corp. All rights reserved. */
/* */
/*---------------------------------------------------------------------------------------------------------*/
#include "ms51_16k.h"
#define STATE_DELAY_TIME 1000
#define RECEIVE_DATA_LENGTH 30
// Global variables
volatile uint16_t systemTick = 0;
uint8_t state = 0;
uint16_t stateFirstTime = 0;
uint16_t stateSecondTime = 0;
volatile uint8_t rxBuffer[RECEIVE_DATA_LENGTH];
volatile uint8_t index = 0;
/************************************************************************************************************/
/* PROTOTYPES */
/************************************************************************************************************/
void timer_1ms_init();
uint16_t millis();
void UART1_Init(void);
void send_at_command(void);
void analyse_data(char*);
void UART1_Write(unsigned char);
void UART1_Write_String(char*);
/************************************************************************************************************/
/* ISR FUNCTIONS */
/************************************************************************************************************/
void Timer2_ISR (void) interrupt 5 // Vector @ 0x2B
{
_push_(SFRS);
systemTick++;
clr_T2CON_TF2;
_pop_(SFRS);
}
void SerialPort1_ISR(void) interrupt 15
{
_push_(SFRS);
if (RI_1)
{
RI_1 = 0;
uart1_receive_data = SBUF_1;
printf("SBUF_1 = %c\r\n",SBUF_1);
if (index < RECEIVE_DATA_LENGTH - 1)
{
rxBuffer[index++] = uart1_receive_data;
if (uart1_receive_data == '\n')
{
rxBuffer[index] = '\0';
analyse_data(rxBuffer);
}
}
}
if (TI_1 == 1)
{
if (!PRINTFG)
{
clr_SCON_1_TI_1; /* if emission occur */
}
}
_pop_(SFRS);
}
/************************************************************************************************************/
/* FUNCTION_PURPOSE: Main Loop */
/************************************************************************************************************/
void main (void)
{
// Init functions
MODIFY_HIRC(HIRC_24);
Enable_UART0_VCOM_printf_24M_115200();
UART1_Init();
timer_1ms_init();
P12_PUSHPULL_MODE;
P12 = 1;
ENABLE_GLOBAL_INTERRUPT;
while(1)
{
switch(state)
{
case 0:
{
state = 1;
}break;
case 1:
{
stateFirstTime = millis();
// printf("stateFirstTime = %u\r",stateFirstTime);
state = 2;
}break;
case 2:
{
stateSecondTime = millis();
// printf("stateSecondTime = %u\n",stateSecondTime);
if (stateSecondTime - stateFirstTime > STATE_DELAY_TIME)
{
P12 ^= 1;
send_at_command();
state = 0;
}
}break;
}
}
}
/************************************************************************************************************/
/* TIMER RELATED FUNCTIONS */
/************************************************************************************************************/
void timer_1ms_init()
{
// Timer2_AutoReload_Interrupt_Initial(24,300000);
TIMER2_DIV_128;
TIMER2_Auto_Reload_Delay_Mode;
RCMP2L = TIMER_DIV128_VALUE_1ms_FOSC_24000000;
RCMP2H = TIMER_DIV128_VALUE_1ms_FOSC_24000000 >> 8;
TL2 = 0;
TH2 = 0;
set_ET2; // Set timerinterrupt
set_TR2; // Start timer
}
uint16_t millis()
{
return systemTick;
}
/************************************************************************************************************/
/* UART RELATED FUNCTIONS */
/************************************************************************************************************/
void UART1_Init(void)
{
P02_INPUT_MODE;
P16_QUASI_MODE;
UART_Open(24000000, UART1_Timer3 , 9600);
ENABLE_UART1_INTERRUPT;
}
void send_at_command(void)
{
UART_Send_Data(UART1,'A');
UART_Send_Data(UART1,'T');
UART_Send_Data(UART1,'+');
UART_Send_Data(UART1,'B');
UART_Send_Data(UART1,'A');
UART_Send_Data(UART1,'U');
UART_Send_Data(UART1,'D');
UART_Send_Data(UART1,'?');
UART_Send_Data(UART1,'\r');
UART_Send_Data(UART1,'\n');
}
void UART1_Write(unsigned char dat)
{
TI_1 = 0;
SBUF_1 = dat;
while (TI_1 == 0);
}
void UART1_Write_String(char* str)
{
while (*str)
{
UART1_Write(*str++);
}
}
void analyse_data(char buffer[])
{
int i = 0;
while (buffer[i] != '\0')
{
printf("%c",buffer[i]);
i++;
}
printf("\n");
// index = 0;
}
Kodum bu while içinde 1 saniyede 1 led yakıyorum ve AT komutunu UART1 üzerinden gönderiyorum. 8051 mimari ile hiç çalışmadım daha önce bu yüzden şu an sorunun ne olduğunu anlayamıyorum bile. Daha önce bu mimari ile çalışmış varsa problemi söyleyebilir mi acaba?
Burada art arda telefondan işlemciye AT+BAUD? stringi gönderiyorum.