Cómo recibir cadenas usando el módulo bluetooth en 8051

0

Estoy haciendo un proyecto en un tablón de anuncios basado en bluetooth. ? En este proyecto, un usuario envía un mensaje usando la aplicación de voz a texto. El módulo bluetooth recibe el mensaje y lo envía al 8051, que lo descodifica y lo envía a la pantalla LCD para su visualización. . La pantalla LCD que estoy usando es de 20x4, por lo que puede mostrar un máximo de 80 caracteres, pero si supera los 80 caracteres, la cuarta línea comenzará a desplazarse por el mensaje. Actualmente, el código que he proporcionado puede recibir 9 caracteres. Pero, ¿cómo modificar este código para recibir cadenas de diferente longitud? (Como el mensaje de entrada que proporciona el usuario cada vez tendrá una longitud diferente) El código es el siguiente:

#include <reg51.h>
#include <string.h>

#define LCD_Data_Bus    P1

#define FirstLine                   0x80
#define SecondLine                  0xC0
#define ThirdLine                   0x94
#define FourthLine                  0xD4
#define MaxSupportedChars       20
#define MaxSupportedLines   4
#define BlankSpace                  ' '

unsigned int LcdTrackLineNum;         //Variable to track the line numbers
unsigned int LcdTrackCursorPos;       //Variable to track the cursor
unsigned int LcdLineNumAddress[]={0x80,0xc0,0x94,0xd4};

sbit _RS= P2^2;      // Register select pin connected to P2.2
sbit _RW= P2^1;      // Read/Write pin connected to P2.1
sbit _EN= P2^0;      // Enable pin connected to P2.0

/* Function prototypes for UART */
void uart_init();   
unsigned rx_data();

void delay_ms(unsigned int);

/* Function prototypes for LCD */
void lcd_cmd(unsigned char cmd);
void lcd_data(unsigned char ascii);
void lcd_init();
void lcd_clear();
void LCD_DisplayChar(char LcdData);
void lcd_msg(char *);
void LCD_GoToNextLine(void);


void main()
{
    unsigned char read[10];
    unsigned char i;
    lcd_init();
    lcd_clear();
    uart_init();
    delay_ms(50);
    lcd_msg("\n  Bluetooth based  \n    Notice Board    ");
    delay_ms(2000);
    while(1)
    {
        lcd_clear();
        lcd_cmd(0x80);
        for(i=0;i<10;i++)
        {
            read[i]=rx_data();
            LCD_DisplayChar(read[i]);
        }   
    }   
}

void uart_init()      // INITIALIZE SERIAL PORT
{
    TMOD = 0x20;        // Timer 1 IN MODE 2-AUTO RELOAD TO GENERATE BAUD RATE
    TH1 = 0xFD;             // LOAD BAUDRATE TO TIMER REGISTER
    SCON = 0x50;        // SERIAL MODE 1, 8-DATA BIT 1-START BIT, 1-STOP BIT, REN ENABLED
    TR1 = 1;                 // START TIMER
}

unsigned rx_data()  
{
    while(RI == 0);         // WAIT UNTIL DATA IS RECEIVED 
    RI = 0;                         // CLEAR FLAG
    return SBUF;                // RETURN SERIAL DATA
}


void delay_ms(unsigned int time)
{
int i,j;
for(i=0;i<=time;i++)
for(j=0;j<=127;j++);
}

void lcd_cmd(unsigned char cmd)
{
    _RS=0;                      // RS = 0 for Command.
   _RW=0;                       // RW = 0 for write.
   LCD_Data_Bus=cmd; // 8bit command to LCD.
   _EN=1;                       // Send a High-to-Low Pusle at Enable Pin.
     delay_ms(5);
   _EN=0;
   delay_ms(5);
}

void lcd_data(unsigned char ascii)
{
   _RS=1;                       // RS = 1 for Data.
   _RW=0;                       // RW = 0 for write.
   LCD_Data_Bus=ascii; // 8bit command to LCD.
   _EN=1;                       // Send a High-to-Low Pusle at Enable Pin.
     delay_ms(2);
   _EN=0;
   delay_ms(2);
}

void lcd_init()
{
    delay_ms(5);
   lcd_cmd(0x38);   //Initilize the LCD in 8bit Mode
   lcd_cmd(0x0E);   // Display ON cursor ON
   lcd_cmd(0x01);   // Clear the LCD
   lcd_cmd(0x80);   // Move the Cursor to First line First Position 
}

void lcd_clear()
{
    lcd_cmd(0x01);
}


void lcd_msg(char *ptr_str)
{
    unsigned char i,j;
    int Size = strlen(ptr_str);
    if(Size > 80)
    {
        for(i=0;i<Size;i++)
        LCD_DisplayChar(ptr_str[i]);
        while(1)
        {
                lcd_cmd(0x0C);

                for(i=60;ptr_str[i];i++)
                {
                    lcd_cmd(FourthLine);
                    for(j=0;j<MaxSupportedChars && ptr_str[i+j];j++)
                            lcd_data(ptr_str[i+j]);
                    for(j=j;j<MaxSupportedChars;j++)
                            lcd_data(BlankSpace);
                    delay_ms(125);
                }
        lcd_cmd(0x0E);
        }
    }
    else
    {
            while((*ptr_str)!= 0)
      LCD_DisplayChar(*ptr_str++);  
    }
}

void  LCD_GoToNextLine(void)
{
    LcdTrackLineNum++;
    LcdTrackCursorPos = 0x00;
    switch(LcdTrackLineNum)
        {
            case 1:
            lcd_cmd(SecondLine);
                break;
            case 2:
            lcd_cmd(ThirdLine);
                break;
            case 3:
            lcd_cmd(FourthLine);
                break;
        }
}

void LCD_DisplayChar(char LcdData)
{
    if((LcdTrackCursorPos >= MaxSupportedChars-1 ) || (LcdData=='\n'))
    {
        /* If the cursor has reached to end of line on page1
        OR NewLine command is issued Then Move the cursor to next line */
        LCD_GoToNextLine();
    }
    if(LcdData != '\n') /* Display the character if its not newLine Char */
    {

        lcd_data(LcdData); /* Display the data and keep track of cursor */
        LcdTrackCursorPos++;
    }
} 
    
pregunta Krish1379

1 respuesta

0

main () especifica un búfer de 10 caracteres para los datos recibidos, luego recibe 9 caracteres para incluirlos. Tienes que cambiar esos números para aceptar la cadena máxima esperada.

También debe asegurarse de que la cadena recibida tenga un terminador definido, para que la rutina de recepción sepa cuándo tiene el mensaje completo.

    
respondido por el Peter Bennett

Lea otras preguntas en las etiquetas