找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请问单片机串口通信程序数组的数据然后使用oled的问题

[复制链接]
跳转到指定楼层
楼主
ID:608920 发表于 2020-2-2 16:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题主写一个项目练习知识,想请教一下问题,就是我想使用串口通信,通过pc来传输数组,然后oled显示图像或字符串,但是通过串口助手通信数据后,oled显示满屏乱码,我oled设置了显示位置和范围限制,我猜测是通信的数组存储代码问题,但是修改了很多次还有查询很多资料都没法解决,想请教一下是哪里的思路出错了,非常感谢各位

单片机源程序如下:
  1. #include<stc.h>//stc12系列51单片机的头文件,被我改名了
  2. #include "oled.h"
  3. #include "picture.h"

  4. #define uch unsigned char
  5. #define uin unsigned int

  6. uin flag;
  7. //unsigned char buf[85];
  8. void send(void);

  9. void main()
  10. {
  11.         SCON=0X50;//9600bps
  12.         PCON=0X00;
  13.         TMOD=0X20;
  14.         EA=1;
  15.         ES=1;
  16.         TL1=0XFD;
  17.         TH1=0XFD;
  18.         TR1=1;
  19.                                 
  20. /*        SCON = 0x50;                //8位数据,可变波特率
  21.         AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
  22.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  23.         TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
  24.         TL1 = 0x70;                //设定定时初值
  25.         TH1 = 0xFF;                //设定定时初值
  26.         ET1 = 0;                //禁止定时器1中断
  27.         TR1 = 1;                //启动定时器1        */ //这段的波特率有问题,被我摒弃了

  28.         Initial_M096128x64_ssd1306();
  29.         Delay_1ms(5);
  30.         fill_picture(0);//以上三行oled清屏初始化
  31.         while(1)
  32.         {
  33.            if(flag)
  34.            {
  35.                         Picture();//显示函数
  36.            }

  37.         }
  38. }

  39. void serial() interrupt 4
  40. {
  41.         ES=0;
  42.         
  43.         if(RI)
  44.         {
  45.                 uin i;
  46.                 for(i=0;i<85;i++)
  47.                 {
  48.                         while(!RI);
  49.                         buf[i]=SBUF;
  50.                         RI=0;
  51.                         if(i==84)
  52.                                 flag=1;
  53.                 }
  54.         }
  55.         
  56.         
  57.         ES=1;
  58. }
复制代码
一下是头文件,另一个是oled初始化文件因为没有太大问题,就不发了
  1. #ifndef        __PICTURE_H
  2. #define        __PICTURE_H
  3. /***********************Picture Code**************************/
  4. unsigned char buf[];
复制代码
这是主函数文件里面的Picture()函数定义
  1. void Picture()
  2. {
  3.   unsigned char x,y;
  4.   unsigned int i=0;
  5.   for(y=0;y<8;y++)
  6.     {
  7.       Write_IIC_Command(0xb0+y);
  8.       Write_IIC_Command(0x0F);
  9.       Write_IIC_Command(0x10);
  10.       for(x=0;x<85;x++)
  11.         {
  12.           Write_IIC_Data(buf[i++]);
  13.         }
  14.     }
  15. }
复制代码





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:168996 发表于 2020-2-2 21:54 | 只看该作者
串口接收(中断)函数有问题
while(1)前一行:
预置buff数据
flag = 1
不要向串口发数据,看一下oled是否正常显示buff数据
回复

使用道具 举报

板凳
ID:93224 发表于 2020-2-3 13:28 | 只看该作者
你这个串口中断写的有问题,比如说有85个数据到来,是需要陆续进入串口中断85次,按照你写的是进入串口中断一次,连续接收85个数据,这明显是有错的
回复

使用道具 举报

地板
ID:93224 发表于 2020-2-3 13:29 | 只看该作者
你这个串口中断接收有问题,串口中断接收是陆续进入中断85次,按照你写的是进入一次中断后,开始连续接收85个数据,明显是错误的
回复

使用道具 举报

5#
ID:608920 发表于 2020-2-3 21:52 | 只看该作者
lele5211314 发表于 2020-2-3 13:29
你这个串口中断接收有问题,串口中断接收是陆续进入中断85次,按照你写的是进入一次中断后,开始连续接收85 ...

你好,中断函数我改成了这样,但是传输的数组数据貌似无法正确存储并被oled引用,而直接写入程序作为code数组来给oled使用能正常显示,不清楚是传输后的缓存问题还是原来使用unsigned char类型数组存储数据方式不恰当,想请多指教一下,因为我是想把一小段只有几秒的动画来串口传输到单片机来作为logo使用,单片机作为归类数据的作用而已,但在这方面卡壳了,谢谢

  1. void serial() interrupt 4
  2. {
  3. //        ES=0;
  4.        
  5.         if(RI)
  6.         {
  7.                
  8.                 buf[i]=SBUF;
  9.                 i++;
  10.                 if(i==85)
  11.                 {
  12.                         flag=1;
  13.                         i=0;
  14. //                        RI=1;
  15.                 }

  16.         }
  17. //        ES=1;
  18.         RI=0;
  19. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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