简体   繁体   中英

Get substring from data received UART and put to LCD

Posted as a new quesion based on this one (OP originally made a massive change to the question that was rolled back), as user stated they could not ask the question themselves.

About PIC 16F877A : I receive from a UART (a COM port) and show to an LCD 16x4. My data received is formed:

Line1#Line2#Line3#Line4

I want to put the data received to LCD as below:

/*LCD16x4
 :~~~~~~~~~~~~~~~~:
 : Line1          :
 : Line2          :
 : Line3          :
 : Line4          :
 :________________:
*/

I put the char array to row x , col y (begin at 1 ) to a LCD by:

lcd_gotoxy(x, y);
printf(lcd_putc, data);

I have a char array:

char data[];

I tried to create getLcdContents function to get the each line one by one:

char* getLcdContents(char arr[], int line)
{
    char delimiter = '#';
    int8 begin = 0;
    int8 end = 0;
    int step = 0;
    char result[20];

    //!   printf("* Array length: %u \r\n", strlen(arr));
    //!   printf("* Array  : %s \r\n",arr);
    for (int8 i = 0; i < strlen(arr); i++)
    {
        if (arr[i] == delimiter)
        {
            end = i;
            step++;
            if (step == line)
            {
                for (int k = 0; k < 20; k++)
                {
                    if (k < end - begin)
                    {
                        result[k] = arr[k + begin];
                        //printf("*result[%u]: %s \r\n",k,arr[k+begin]);
                    }
                    else
                    {
                        result[k] = " ";
                    }
                }
            }
            begin = i + 1;
        }
    }

    result[20] = '\0';
    printf("* Line%u  : %s \r\n", line, result);
    return result;
}

Then get data from RDA_isr(void) to put to LCD by:

#INT_RDA
Void RDA_isr(Void)
{
    gets(rx);

    char* row1 = getLcdContents(rx, 1);
    lcd_gotoxy(1, 1);
    printf(lcd_putc, row1);

    char* row2 = getLcdContents(rx, 2);
    lcd_gotoxy(1, 2);
    printf(lcd_putc, row2);

    char* row3 = getLcdContents(rx, 3);
    lcd_gotoxy(1, 3);
    printf(lcd_putc, row3);

    char* row4 = getLcdContents(rx, 4);
    lcd_gotoxy(1, 4);
    printf(lcd_putc, row4);
}

But is does not work. Can anyone help me? Thank you very much!

First of all you return local variable which does not exists any more when function returns.

As it is an PIC uC I would personally reuse the original string to preserve the memory.

int split(char **argv, char *string)
{
    int argc = 0;

    argv[0] = string;
    while(*string)
    {
        if(*string == '#') 
        {
            *string = 0;
            argc++;
            argv[argc] = string + 1;
        }
            string++;
    }
    if(argv[argc][0]) argc++;
    return argc;
}

Thanks for all your help.

I 've done with this code in 2 solutions:

  1. Split by # char:
#include <string.h>
#include <stdio.h>

char rx[80];
char result[17];

//Line1#Line2#X: 11226655#Y: 123#
char *getLcdContents(char *arr,int line)
{
   char delimiter = '#';
   int begin = 0;
   int end = 0;
   int step = 0;

   //printf("* Array length: %u \r\n", strlen(arr));
   //printf("* Array  : %s \r\n",arr);
   for(int i = 0; i < strlen(arr); i++)
   {
      if (arr[i] == delimiter)
      {
         end = i;
         step ++;
         if(step == line)
         {
            for (int k = 0; k < 16; k++)
            {
               if(k<end-begin)
               {
                  result[k] = arr[k+begin];
               }
               else
               {
                  result[k] = ' ';
               }
            }  
         }
         begin = i + 1;                
      }
   }

   result[16] ='\0';
   //printf("* Line%u  : %s \r\n",line,result);// in len pc
   return result;
}

void main()
{
 char *a = "Line1#Line2#X: 11226655#Y: 123#";
 char* content = NULL;

 content = getLcdContents(a, 1);
 printf("%s\r\n",content);

 content = getLcdContents(a, 2);
 printf("%s\r\n",content);

 content = getLcdContents(a, 3);
 printf("%s\r\n",content);

 content = getLcdContents(a, 4);
 printf("%s\r\n",content);

 //system("pause");
}

  1. Split each line by a char in a array: char delimiter[]={'~','!','@','#','$'} :
#include <string.h>
#include <stdio.h>
#include<time.h>

char rx[80];
char result[17];

void setTimeout(int milliseconds)
{
    // If milliseconds is less or equal to 0
    // will be simple return from function without throw error
    if (milliseconds <= 0) {
        fprintf(stderr, "Count milliseconds for timeout is less or equal to 0\n");
        return;
    }

    // a current time of milliseconds
    int milliseconds_since = clock() * 1000 / CLOCKS_PER_SEC;

    // needed count milliseconds of return from this timeout
    int end = milliseconds_since + milliseconds;

    // wait while until needed time comes
    do {
        milliseconds_since = clock() * 1000 / CLOCKS_PER_SEC;
    } while (milliseconds_since <= end);
}

//Data~Line1!Line2@Line3#Line3$
void action(char *arr,int line)
{
   char delimiter[]={'~','!','@','#','$'};
   int begin = 0;
   int end = 0;
   int step = 0;

   switch(line)
      {
          case 0: step = 0; break;
          case 1: step = 1; break;
          case 2: step = 2; break;
          case 3: step = 3; break;
          case 4: step = 4; break;
          default: break;
      }

   //printf("* Array length: %u\r\n", strlen(arr));
   printf("* Array  : %s \r\n",arr);
   for(int i = 0; i < strlen(arr); i++)
   {
      if (arr[i] == delimiter[step])
      {
         for(int k = i; k >= 0; k--)
         {
            if(arr[k] == delimiter[step-1])
            {
                begin = k + 1;
            }
         }

         //printf("Begin: %u\r\n",begin);
         //printf("End  : %u\r\n",i);
         for(int l = 0; l < 16; l++)
         {
             if(l<i-begin)
                result[l] = arr[l+begin];
             else
                result[l] = ' ';
         }
         break;
      }
   }

   result[16] ='\0';
   if (line == 0)
   {
     printf("Check condition here...\r\n");
   }
   else
   {
     printf("* Line%u: %s \r\n",line,result);
   }
   //lcd_gotoxy(1,line);
   //printf(lcd_putc,result);
}
char rx[80];
int main()
{
  char *a = "Dat~Line1!Line2@Line3#Line4$";
  while(1)
  {
    for(int i = 0; i < strlen(a);i++)
    {
      setTimeout(50);
      char rcv=a[i];
      rx[i]=rcv;
      if(rcv=='~')
        action(rx, 0);
      else if(rcv=='!')
        action(rx, 1);
      else if(rcv=='@')
        action(rx, 2);
      else if(rcv=='#')
        action(rx, 3);
      else if(rcv=='$')
      {
        action(rx, 4);
        memset(rx, 0, sizeof rx);
      }   
    }
  }
 //system("pause");
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM