找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2098|回复: 13
打印 上一主题 下一主题
收起左侧

stm32串口数据显示问题

[复制链接]
回帖奖励 1 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:248659 发表于 2020-2-24 17:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大佬们,我又来问问题我再学习stm32串口的时候,看的是浦中的视屏资料,觉得操作起来还是很简单的,但是当我想拓展一下的时候出现了问题,哎

我打算把串口的数据显示在屏幕上
使用浦中教的串口写法,写出接受部分,
void USART2_IRQHandler(void)                        //串口2 中断服务程序
{
                        static u16 count = 0;
                        u16 rdata;
                        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
                                {
                                         rdata = USART_ReceiveData(USART2);        //读取接收到的数据
                                         Res[count++] = rdata;                                               
                                         USART2->DR;
                                                //USART_SendData(USART2,rdata);
                                                //while(USART_GetFlagStatus(USART2,USART_FLAG_TC) != SET);
                                }       
                                        USART_ClearFlag(USART2,USART_IT_RXNE);
                                        USART2->DR;
                                        USART2->SR;
                       
}

然后把接受到res里的数据在主函数中调用lcd函数显示出来
LCD_ShowString (0,0,&Res);
这个时候数据会一直接受一直存,不会清控,接受什么数据都会排在后面显示出来
然后我的想法就是直接清空res,屏幕上就会一直显示不同的数据了,但是又没想明白放在那里

还有就是想问一下sprintf函数到底应该如何用,早先我显示的时候是这样写的(A是char类型的)
sprintf(A,"%S", Res[0]);
LCD_ShowString (0,0,A);

然后屏幕上什么都不显示。。。


显示代码:
void LCD_ShowString(u16 x,u16 y,const u8 *p)
{         
    while(*p!='\0')
    {      
        if(x>LCD_W-16){x=0;y+=16;}
        if(y>LCD_H-16){y=x=0;LCD_Clear(RED);}
        LCD_ShowChar(x,y,*p,0);
        x+=8;
        p++;
    }  
}


已经整麻了。。。自学得有点晕头转向。。。。疯狂碰壁。。。望大佬指点
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:248659 发表于 2020-2-24 20:22 | 只看该作者
如果我在这后面添加了清零Res[count++] = rdata;
那么在屏幕显示上只能接受到最后一位,比如发了1234,就只有4,如果发送速度快一点,还会出现24,34这样的,我想这应该是指针问题,但是还没想明白怎么解决
回复

使用道具 举报

板凳
ID:419968 发表于 2020-2-25 00:20 | 只看该作者
LCD_ShowString (0,0,&Res);改成LCD_ShowString (0,0,Res);看看
回复

使用道具 举报

地板
ID:248659 发表于 2020-2-25 11:49 | 只看该作者
adject 发表于 2020-2-25 00:20
LCD_ShowString (0,0,&Res);改成LCD_ShowString (0,0,Res);看看

不能去哦,去了就直接接受回来的数据不显示了
回复

使用道具 举报

5#
ID:679425 发表于 2020-2-25 13:11 | 只看该作者
LCD_ShowChar(x,y,*p,0);,怎么多出个0来呢?
回复

使用道具 举报

6#
ID:248659 发表于 2020-2-25 16:08 | 只看该作者
haierzaifei11 发表于 2020-2-25 13:11
LCD_ShowChar(x,y,*p,0);,怎么多出个0来呢?

嗷嗷,这个是showchar里面有个模式的原因,代码如下
/在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示                                 
//size:选择字体 16/12
  1. void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
  2. {              
  3.         unsigned char c=0,i=0;        
  4.                 c=chr-' ';//得到偏移后的值                        
  5.                 if(x>Max_Column-1){x=0;y=y+2;}
  6.                 if(Char_Size ==16)
  7.                         {
  8.                         OLED_Set_Pos(x,y);        
  9.                         for(i=0;i<8;i++)
  10.                         OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  11.                         OLED_Set_Pos(x,y+1);
  12.                         for(i=0;i<8;i++)
  13.                         OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  14.                         }
  15.                         else {        
  16.                                 OLED_Set_Pos(x,y);
  17.                                 for(i=0;i<6;i++)
  18.                                 OLED_WR_Byte(F6x8[c][i],OLED_DATA);
  19.                                 
  20.                         }
  21. }
复制代码
回复

使用道具 举报

7#
ID:248659 发表于 2020-2-25 21:28 | 只看该作者
别沉哇,嘤嘤嘤
回复

使用道具 举报

8#
ID:88172 发表于 2020-2-26 10:14 | 只看该作者
添加头文件   #include <string.h>,并在  USART2->DR;USART2->SR;后面添加  memset(Res,0,sizeof(Res));试试
回复

使用道具 举报

9#
ID:698552 发表于 2020-2-26 15:23 | 只看该作者
建议你网上看下人家调通的程序,网上很多的
回复

使用道具 举报

10#
ID:698552 发表于 2020-2-26 15:26 | 只看该作者
#include "stdio.h",void LCD_ShowString(u16 x,u16 y,const u8 *p)该函数的参数统一
回复

使用道具 举报

11#
ID:248659 发表于 2020-2-27 00:17 | 只看该作者
司海心 发表于 2020-2-26 10:14
添加头文件   #include ,并在  USART2->DR;USART2->SR;后面添加  memset(Res,0,sizeof(Res));试试

主函数里面还是直接用showstring这个函数吗,还是调用sprintf这个函数以后再调用showstring呢,如果还是直接使用showstring函数,接受回来的字符串还是会一直累加直到占满屏幕,如果调用sprint函数再调用showstring直接是不显示

我的sprintf函数是这样写的
char A
sprintf(A,"USART: %S", Res[0]);
LCD_ShowString (0,0,A);
是否是因为我的写法有问题,或者根本函数使用方法不对呢,望回复
回复

使用道具 举报

12#
ID:248659 发表于 2020-2-27 00:18 | 只看该作者
zjgchenzhen 发表于 2020-2-26 15:26
#include "stdio.h",void LCD_ShowString(u16 x,u16 y,const u8 *p)该函数的参数统一

说实话,没看明白
回复

使用道具 举报

13#
ID:248659 发表于 2020-2-27 00:21 | 只看该作者
zjgchenzhen 发表于 2020-2-26 15:23
建议你网上看下人家调通的程序,网上很多的

看了呢,但是移植过来就不对了呢,usart还是tft程序我都有参考,但是只能实现单一功能,初学stm32,还是菜鸟代码看不懂的我就抄,这是实在看不明白了,所以来论坛请教
回复

使用道具 举报

14#
ID:699089 发表于 2020-2-27 15:04 | 只看该作者
不管是串口还是TFT,测试时先将单个功能代码测试,其他功能代码屏蔽,单个测试
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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