OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7216|回复: 26

求助 我想做一个电脑通过串口发送字符串给单片机,LCD显示的实验

[复制链接]

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
发表于 2016-4-5 12:44:44 | 显示全部楼层 |阅读模式
5金钱
LCD_ShowString(30,130,200,12,16,USART_RX_BUF);        就是把LCD实验和串口实验结合了一下,让LCD显示单片机接收到的内容USART_RX_BUF【】;

但是比如说我发送的是AAAAA; 显示屏会显示AAAAA;
但是当我下一次发送BBB时,显示屏显示的BBBAA;
怎么才能解决这个问题呀?好苦恼。。。
       


最佳答案

查看完整内容[请看2#楼]

在你的LCD显示程序中增加一个清除功能就行了了, 设定一个最大的字符串长度, 然后, 做一个空格字符串 两种方法实现 1 每次收到新的显示数据前, 都先调用显示程序显示这个空格字符串,然后再显示收到的字符串就行了, 这就是先清除再显示 2 多用一个数组, 大于与空格字符串多一个字节就行, 每次收到数据后, 先次空格字符串复制到数组中, 然后再复制收到的数据到数组,这个数组前面的空格字符就会被你复制进去 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-4-5 12:44:45 | 显示全部楼层
本帖最后由 likunxue 于 2016-4-5 22:23 编辑

在你的LCD显示程序中增加一个清除功能就行了了,

设定一个最大的字符串长度, 然后, 做一个空格字符串
两种方法实现

1  每次收到新的显示数据前, 都先调用显示程序显示这个空格字符串,然后再显示收到的字符串就行了, 这就是先清除再显示

2  多用一个数组, 大于与空格字符串多一个字节就行, 每次收到数据后, 先次空格字符串复制到数组中, 然后再复制收到的数据到数组,这个数组前面的空格字符就会被你复制进去的有效字符代替, 后面的依然是空格字符, 这样现把这个数组当字符串去显示就行了,

两数方法, 第一种简单,但需要调用两次显示, 第二种软件有点复杂,但只调用一次显示就行了,速度比第一种快很多。
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-5 13:39:05 | 显示全部楼层
顶            
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-2-25
在线时间
2 小时
发表于 2016-4-5 13:49:06 | 显示全部楼层
因为BBB把原来的前三个A覆盖了。所以显示的是BBBAA
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-5 13:55:27 | 显示全部楼层
1052687889 发表于 2016-4-5 13:49
因为BBB把原来的前三个A覆盖了。所以显示的是BBBAA

我知道。。。。我的意思是怎么才不显示后面AA,只显示BBB。。。我想在显示之前先把USART_RX_BUF先清零,但是没成功,是不是应该从LCD部分下手?
回复

使用道具 举报

4

主题

62

帖子

0

精华

高级会员

Rank: 4

积分
788
金钱
788
注册时间
2015-8-21
在线时间
128 小时
发表于 2016-4-5 14:16:40 | 显示全部楼层
屏幕显示区域得重新刷新才可以清除原来的显示数据
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-5 14:26:11 | 显示全部楼层
—孤独¥的风 发表于 2016-4-5 14:16
屏幕显示区域得重新刷新才可以清除原来的显示数据

void LCD_Clear(u16 Color);        用这个?
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-5 14:39:56 | 显示全部楼层
AAAAA的数据还存在USART_RX_BUF以后,下次发送BBB,里面的数据会变成BBBAA,在此之前应该先把USART_RX_BUF清空一下?
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-5 15:10:58 | 显示全部楼层
顶       啊啊啊啊啊还是不行   救命啊。。。。
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-5 15:22:44 | 显示全部楼层
@正点原子  原子哥哥在不在
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-5 15:30:07 | 显示全部楼层
想到一种很蠢的办法,每收到一次数据就初始化一下LDC;    这种方法会不会影响程序运行速度啊,我确实不知道该怎么清除我需要显示接收到的字符串的那一行的数据,求个大神告诉我!!!
搜狗截图16年04月05日1527_1.jpg
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2016-4-5 15:31:32 | 显示全部楼层
串口接收肯定有长度的,那你直接显示你要的字符串的长度就可以了
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-5 15:36:18 | 显示全部楼层
三叶草 发表于 2016-4-5 15:31
串口接收肯定有长度的,那你直接显示你要的字符串的长度就可以了

我每次接受的字符串为放在USART_RX_BUF这里,长度为len,我用LCD_ShowString(30,130,200,12,16,USART_RX_BUF);   这个语句怎么设定显示长度为len?
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-5 20:36:10 | 显示全部楼层
ding      
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-5 22:51:54 | 显示全部楼层
likunxue 发表于 2016-4-5 22:21
在你的LCD显示程序中增加一个清除功能就行了了,

设定一个最大的字符串长度, 然后, 做一个空格字符串 ...

额 原谅我C语言学的不好,,,我先试了一下第一种方法在收到数据后先显示空格字符,我是直接这样写的(不知道这样对不对。。。):
                if(USART_RX_STA&0x8000)
                {       
                LCD_ShowString(30,130,200,12,16,"                               ");//空格字符串?这样写对不对?
然后再显示收到的数据,好像还是不行,是不是因为USART_RX_BUF里的数据还没清除呀?
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-5 23:09:52 | 显示全部楼层
likunxue 发表于 2016-4-5 22:21
在你的LCD显示程序中增加一个清除功能就行了了,

设定一个最大的字符串长度, 然后, 做一个空格字符串 ...

你说的把空格字符串复制到数组中是把空格的ASCII码放到数组中的意思吗?
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-4-5 23:15:01 | 显示全部楼层
xiaobudonglaosh 发表于 2016-4-5 22:51
额 原谅我C语言学的不好,,,我先试了一下第一种方法在收到数据后先显示空格字符,我是直接这样写的(不 ...

你在串口发送的字符串的结层加上一上0, 记住是0 不是"0" 的字符, 这个显示程序在显示字符串时,遇到0就会自动退出显示,这个在写显示程序时,一般人都会这样做的, 如果你的显示例程是原子哥的,哪就不用担收, 在发送字符串的结尾加一个0就行了, 或都如你所说, 是你没有清除接收缓存区的数据的结果, 有个简单的办法就是每次显示结束后,清零接收缓存区的数组为0值.就行了
回复

使用道具 举报

79

主题

399

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1825
金钱
1825
注册时间
2015-9-21
在线时间
560 小时
发表于 2016-4-5 23:15:09 | 显示全部楼层
擦除了,重新显示啊
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-5 23:20:54 | 显示全部楼层
likunxue 发表于 2016-4-5 22:21
在你的LCD显示程序中增加一个清除功能就行了了,

设定一个最大的字符串长度, 然后, 做一个空格字符串 ...

用第二种是可以的!!谢谢!我定义了一个跟USART_RX_BUF一样长度的数组word[200];
if(USART_RX_STA&0x8000)
                {                                       
            for(i=0;i<200;i++)
                        {
                                word=0x20;//每一个字节都是空格
                        }
                        len=USART_RX_STA&0x3FFF;//
                        for(t=0;t<len;t++)
                        {
                                USART1->DR=USART_RX_BUF[t];
                                while((USART1->SR&0X40)==0);
                                for(j=0;j<len;j++)
                                {
                                        word[j]=USART_RX_BUF[j];//把收到数据放到word里
                                }
                        }
                        printf("\r\n\r\n");//
                        USART_RX_STA=0;
                        LCD_ShowString(30,130,200,12,16,word);
                }                       
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-4-5 23:26:41 | 显示全部楼层
xiaobudonglaosh 发表于 2016-4-5 23:20
用第二种是可以的!!谢谢!我定义了一个跟USART_RX_BUF一样长度的数组word[200];
if(USART_RX_STA&0x80 ...

回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-5 23:28:02 | 显示全部楼层
likunxue 发表于 2016-4-5 22:21
在你的LCD显示程序中增加一个清除功能就行了了,

设定一个最大的字符串长度, 然后, 做一个空格字符串 ...

如果说我只定义一个比空格字符串多一个字节的数组,好像还是不行,假如说这个数组word只有2字节(u8 word[2]),但是我收到的数据有5个字节(AAAAA),在赋值的过程中,word的第3、4、5个字节位也会被赋值?下一次我只发送一个字节(B),这时会显示成:B空格AAA;
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-4-5 23:32:49 | 显示全部楼层
xiaobudonglaosh 发表于 2016-4-5 23:28
如果说我只定义一个比空格字符串多一个字节的数组,好像还是不行,假如说这个数组word只有2字节(u8 word ...

你的空格字符串当然要大于你所收到显示数据的最大值嘛, 这个只能由你自已的情况来定, 多一个字节就是要放我说的哪个结束符 '\0'   一般情况我都直接用0代替了
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-5 23:35:22 | 显示全部楼层
likunxue 发表于 2016-4-5 23:32
你的空格字符串当然要大于你所收到显示数据的最大值嘛, 这个只能由你自已的情况来定, 多一个字节就是要放 ...

谢谢大神,,,睡觉之前总算把白天的事情弄好了  
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-4-5 23:36:35 | 显示全部楼层
xiaobudonglaosh 发表于 2016-4-5 23:35
谢谢大神,,,睡觉之前总算把白天的事情弄好了

不用谢, 5分给我就行! 我就冲你哪5分来的,笑!!!!!1
回复

使用道具 举报

13

主题

448

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1755
金钱
1755
注册时间
2015-2-7
在线时间
369 小时
发表于 2016-4-6 06:42:19 来自手机 | 显示全部楼层
在数组后面加’\0'
回复

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
 楼主| 发表于 2016-4-6 08:35:00 | 显示全部楼层
likunxue 发表于 2016-4-5 23:32
你的空格字符串当然要大于你所收到显示数据的最大值嘛, 这个只能由你自已的情况来定, 多一个字节就是要放 ...

早上起来再想想,在后面一个字节加0的方法:
就是说我接收到USART_RX_BUF[]是5个字节,然后我给word赋值6个字节,前五个字节等于USART_RX_BUF[4],最后一个字节是八个0,是这个意思吗?
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2017-7-18
在线时间
10 小时
发表于 2017-12-7 15:31:18 | 显示全部楼层
我也在做这个,能参考下程序吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 18:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表