从接收到的UART数据中获取子字符串并放入LCD

问题描述 投票:2回答:2

发布为基于this one的新问题(OP最初对已回退的问题进行了重大更改,因为用户表示自己不能问这个问题。

关于PIC 16F877A:我从UART(COM端口)接收并显示到LCD 16x4。我收到的数据已形成:

Line1#Line2#Line3#Line4

我想如下将接收到的数据放入LCD:

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

我将char数组放在x行,将y列(从1开始)通过LCD

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

我有一个char数组:

char data[];

我试图创建getLcdContents函数来逐行获取每一行:

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;
}

然后通过以下方式从RDA_isr(void)获取数据并放入LCD

#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);
}

但是是行不通的。谁能帮我?非常感谢!

c pic
2个回答
1
投票

感谢您的所有帮助。

我已经在2个解决方案中使用此代码:

  1. #字符分割:
#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. 用数组中的一个字符分割每行: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");
}


2
投票

首先,返回函数返回时不再存在的局部变量。

因为它是PIC uC,所以我个人将重用原始字符串以保留内存。

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;
}

© www.soinside.com 2019 - 2024. All rights reserved.