发布为基于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);
}
但是是行不通的。谁能帮我?非常感谢!
感谢您的所有帮助。
我已经在2个解决方案中使用此代码:
- 由
#
字符分割:
#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");
}
- 用数组中的一个字符分割每行:
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");
}
首先,返回函数返回时不再存在的局部变量。
因为它是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;
}