OpenEdv-开源电子网

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

求助!使用串口发送数据,让数据在显示屏的固定位置显示出来。

[复制链接]

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
发表于 2018-5-29 08:26:58 | 显示全部楼层 |阅读模式
3金钱
使用串口发送数据,让数据在显示屏的固定位置显示出来,已经可以实现。但是为什么开发板断电后重新上点,串口发送数据后显示屏显示异常,重新下载一遍程序后又恢复正常了?

最佳答案

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

这不就证明了串口接收没问题吗?所以问题就是出在显示环节或接收后发送至显示的环节,一点点排除即可
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-5-29 17:08:52 | 显示全部楼层
是我Num_To_Str这个函数有问题,已经解决了,谢谢大家的帮助!
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-5-29 08:26:59 | 显示全部楼层
qiuzhicheng 发表于 2018-5-29 13:55
而且回发给串口助手,打印的也还是我发送的数据,但是显示就不对

这不就证明了串口接收没问题吗?所以问题就是出在显示环节或接收后发送至显示的环节,一点点排除即可
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-5-29 08:51:48 | 显示全部楼层
给出的描述信息太少了,无法判断。
回复

使用道具 举报

11

主题

2148

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4909
金钱
4909
注册时间
2015-1-10
在线时间
615 小时
发表于 2018-5-29 09:05:04 | 显示全部楼层
请描述清楚问题,你的程序如何处理的
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-5-29 10:57:07 | 显示全部楼层
串口3的中断函数:
void USART3_IRQHandler()
{
        u8 n;
        static u8 cnt = 0;

        if(USART_GetITStatus(USART3,USART_IT_RXNE) != RESET)//即′if((USART3->SR & 1<<5))  读数据寄存器非空
        {
          n = USART_ReceiveData(USART3);   //(USART3->DR);读取接收到的数据
                if(n == '#')                     //作为结束标志
                {
                        Uaer3_RxBuf[cnt] = '\0';
                        Uaer3_Rxflag = 1;              //表示串口3收到数据
                        cnt = 0;
                }
                else if(n < 48) //非数字
                {
                       
                }
                else if(n > 57) //非数字
                {
                       
                }
                else
                {
                        Uaer3_RxBuf[cnt] = n;
                        cnt++;
                }               
        }
}
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-5-29 11:00:19 | 显示全部楼层
//数字转换成字符,并在显示屏显示出来
void Num_To_Str(u16 x,u16 y,double value)
{
    u16 IntegerPart;     //整数部分
    float DecimalPart;   //小数部分
    u8 i = 0,a,b;
    u8 j=0;
    u8 array[20];
    u8 shuzu[20];
    if(value >= 1)
    {
       IntegerPart = (u16)value;
       DecimalPart = value - IntegerPart;
    }
    else
    {
       IntegerPart = 0;
       DecimalPart = value - IntegerPart;
    }

    if(IntegerPart == 0)   //整数部分为0
    {
       shuzu[0] = '0';
                         shuzu[1] = '0';
                         shuzu[2] = '0';
       shuzu[3] = '.';
       i = 3;
    }
    else
    {
       while(IntegerPart > 0)
       {
          array[i] = IntegerPart % 10 + '0';  //取最低位的值
          IntegerPart /= 10;
          i++;                                //整数有效位个数
       }
       a=i-1;
       if(i != 3)
                         {
                                 shuzu[0] = '0';
                                 j = b = 1;
                                 if(i != 2)
                           {
                                   shuzu[1] = '0';
                                   j = b = 2;
                           }
                         }

       for(; j<i+b; j++)
       {
          shuzu[j] = array[a];
          a--;
       }

       shuzu[3] = '.';
    }
    shuzu[4] = (u16)(DecimalPart * 10)%10 + '0';
  
    shuzu[5] = '\0';     
    Lcd_DisString(x, y, (const char *)shuzu, 0xffff,BLUE2);               
}
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-5-29 11:04:28 | 显示全部楼层
        主函数中:
if(Uaer3_Rxflag == 1)
{       
Uaer3_Rxflag = 0;
                        input_voltage   = (Uaer3_RxBuf[0]-'0')*100  + (Uaer3_RxBuf[1] -'0')*10 + (Uaer3_RxBuf[2]-'0') +(double)(Uaer3_RxBuf[3]-'0')/10;
                        output_voltage  = (Uaer3_RxBuf[4]-'0')*100  + (Uaer3_RxBuf[5] -'0')*10 + (Uaer3_RxBuf[6]-'0') +(double)(Uaer3_RxBuf[7]-'0')/10;
                        battery_voltage = (Uaer3_RxBuf[8]-'0')*100  + (Uaer3_RxBuf[9] -'0')*10 + (Uaer3_RxBuf[10]-'0')+(double)(Uaer3_RxBuf[11]-'0')/10;
                        frequency       = (Uaer3_RxBuf[12]-'0')*100 + (Uaer3_RxBuf[13] -'0')*10+ (Uaer3_RxBuf[14]-'0')+(double)(Uaer3_RxBuf[15]-'0')/10;
                       
                        Num_To_Str(90,150,input_voltage);     
                        Num_To_Str(240,150,output_voltage);   
                        Num_To_Str(90, 170, battery_voltage);
                        Num_To_Str(240,170,frequency);
}
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-5-29 11:19:45 | 显示全部楼层
kvdong 发表于 2018-5-29 08:51
给出的描述信息太少了,无法判断。

下载程序后,串口可以发送数据并在显示屏正确显示。但是拔掉开发板电源,再重新上电后,串口发送数据不能在串口正确显示。比如我发送012.3 456.7 891.0 111.2#,显示屏显示的是012.3 012.7 012.0 012.2;发送的第一个数据如果大于100的话,显示的整数位不变,小数位会根据串口发送的改变,发送的第一个数据小于100的话,显示的4个数据整数位都会变成第一个数据,小数部分会正常显示
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-5-29 11:21:04 | 显示全部楼层
阿侑kevin 发表于 2018-5-29 09:05
请描述清楚问题,你的程序如何处理的


kvdong 发表于 2018-5-29 08:51
给出的描述信息太少了,无法判断。

下载程序后,串口可以发送数据并在显示屏正确显示。但是拔掉开发板电源,再重新上电后,串口发送数据不能在串口正确显示。比如我发送012.3 456.7 891.0 111.2#,显示屏显示的是012.3 012.7 012.0 012.2;发送的第一个数据如果大于100的话,显示的整数位不变,小数位会根据串口发送的改变,发送的第一个数据小于100的话,显示的4个数据整数位都会变成第一个数据,小数部分会正常显示
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-5-29 11:22:22 | 显示全部楼层
但是重新下载一遍程序又能正常显示了
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-5-29 11:47:59 | 显示全部楼层
你是用什么方式下载程序的
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-5-29 11:53:42 | 显示全部楼层
kvdong 发表于 2018-5-29 11:47
你是用什么方式下载程序的

J-link下载器,SWD模式  (和怎么下载程序没关系吧..)
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-5-29 12:21:19 | 显示全部楼层
显示之前把显示区域清空下就好了。
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-5-29 12:23:32 | 显示全部楼层
感觉跟串口接收的关系不太大,有可能出在显示上。你可以先验证一下你的显示程序。
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-5-29 13:45:07 | 显示全部楼层
kvdong 发表于 2018-5-29 12:23
感觉跟串口接收的关系不太大,有可能出在显示上。你可以先验证一下你的显示程序。

显示程序应该没问题,界面其他地方都没问题,而且重新下一遍程序,串口发送数据显示也可以的。就是不知道断电再上电就不行了
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-5-29 13:48:59 | 显示全部楼层
szczyb1314 发表于 2018-5-29 12:21
显示之前把显示区域清空下就好了。

显示时会把前一次的覆盖啊,位置是一样的
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-5-29 13:55:57 | 显示全部楼层
而且回发给串口助手,打印的也还是我发送的数据,但是显示就不对
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1814
金钱
1814
注册时间
2011-10-9
在线时间
230 小时
发表于 2018-5-29 14:26:23 | 显示全部楼层
如果我出现这个情况 会先检查 初始化部分   是不是某些数据指针 没初始化
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-5-29 14:26:50 | 显示全部楼层
qiuzhicheng 发表于 2018-5-29 13:48
显示时会把前一次的覆盖啊,位置是一样的

单步debug下,跟踪看看吧
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-5-29 14:39:00 | 显示全部楼层
szczyb1314 发表于 2018-5-29 14:26
单步debug下,跟踪看看吧

调试的时候串口可以发数据过来吗
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-5-29 15:29:01 | 显示全部楼层
你可以做一个生成数据的小函数,每次固定生成4个你所用的数据,每隔一段时间(几秒钟吧)刷新一遍数据(所有的数据都可预测,比如每次刷新加1),用这组数据发送至显示,然后看看显示是否正常。
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-5-29 16:38:45 | 显示全部楼层
kvdong 发表于 2018-5-29 15:29
你可以做一个生成数据的小函数,每次固定生成4个你所用的数据,每隔一段时间(几秒钟吧)刷新一遍数据(所 ...

搞不出来。。下载程序后和断电后重新上电有什么地方改变了吗?
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-5-29 20:39:45 | 显示全部楼层
float input_voltage_buffer[10] = {123.4,  234.5,  345.6,  456.7, 567.8,  678.9,  789.0,  890.1,  901.2,  12.3};
float output_voltage_buffer[10] =  {678.9,  789.0,  890.1,  901.2,  12.3,  123.4,  234.5,  345.6,  456.7, 567.8};
uint32_t  number_cnt=0;
uint8_t   buffer_pre=0;
void number_create(void)
{
       number_cnt++;
       if (number_cnt > 1000)//计数值根据你的程序运行速度调整
      {
            number_cnt = 0;
            input_voltage = input_voltage_buffer[ buffer_pre] ;
            output_voltage = output_voltage_buffer[buffer_pre];
            buffer_pre++;
            if (buffer_pre > 9)
           {
                       buffer_pre = 0;
           }
                        Num_To_Str(90,150,input_voltage);     
                        Num_To_Str(240,150,output_voltage);   

      }
}

把你8楼发的主函数if()整体注释掉,把这个函数调用到主函数里,观察屛显示。

其实最方便的就是DEBUG调试,可以很直接的观察到现象。
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-5-30 08:17:57 | 显示全部楼层
kvdong 发表于 2018-5-29 20:39
float input_voltage_buffer[10] = {123.4,  234.5,  345.6,  456.7, 567.8,  678.9,  789.0,  890.1,  901 ...

嗯嗯,谢谢!试了你的程序,显示ok。DEBUG的话好像我还不怎么会用....
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-5-30 08:24:46 | 显示全部楼层
qiuzhicheng 发表于 2018-5-30 08:17
嗯嗯,谢谢!试了你的程序,显示ok。DEBUG的话好像我还不怎么会用....

正点原子的开发板教程上应该有DEBUG的使用介绍,或者从其它渠道学习也可。DEBUG才是程序开发的“第一利器”,一定要优先学会使用。
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-5-30 08:31:15 | 显示全部楼层
kvdong 发表于 2018-5-30 08:24
正点原子的开发板教程上应该有DEBUG的使用介绍,或者从其它渠道学习也可。DEBUG才是程序开发的“第一利器 ...

好的,我去找下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-5 09:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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