找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15W4K系列单片机串口2与串口1收发问题

[复制链接]
回帖奖励 5 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:189897 发表于 2017-10-1 17:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近想实现一个功能,就是在串口助手上发送05 0B  D5 C5 C8 FD这一串指令,使其在液晶上显示张三两字,05代表了数据长度 就是说后面还跟上5个数据;0B是命令字,能够控制液晶上显示不同的命令;D5 C5 C8 FD是取字模可以得到张三这个名字。但是我用串口1是可以实现这个功能的,我想改成串口2就不行了,出现错误;想让大神们帮忙看看。(串口1的代码与这个相似,我只不过把串口初始化函数和串口中断接收函数变化了,本质没变)
串口2的实现代码:
#include "STC15Fxxxx.h"
#include "INTRINS.H"
#include "stdio.h"
#include "string.h"
#include "COGDriver.h"
#include "font.h"
#include "W25Qxx.h"
#define uchar unsigned char
#define OSC_FREQ     11059200L //晶振是11.0592
#define BAUD_115200  115200    //串口波特率
#define   S2REN   0x10  //S2CON.5
#define   S2RI    0x01  //S2CON.0
#define   S2TI    0x02  //S2CON.1
#define delay     1            //定义延时时间
#define CALL_isr_UART()  TI = 1
#define FALSE   0
#define TRUE    1
sbit SPEAKER  = P1^3;
unsigned int counter=0;
unsigned long faddress=0;
//unsigned char tishi=0;
unsigned char xdata tempBuffer[255],RevBuffer[255];
bit CmdValid,flagg=0;
void Delay(int num);
void Delaylong(unsigned int t);
void Delaylong(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
{
  for(j=0;j<10;j++);
}
}
// 串口初始化函数
void Uart2Init(void)
{
S2CON = 0x50;  //8位数据,可变波特率
AUXR |= 0x04;  //定时器2时钟为Fosc,即1T
T2L = 0xE8;    //设定定时初值
T2H = 0xFF;    //设定定时初值
AUXR |= 0x10;  //启动定时器2

IE2 |= 0x01;    //使能串口2中断
S2CON |= S2REN; //允许串行口2接收
}
/*************接收和发送中断**********************************************/
void isr_UART2(void) interrupt 8 //using 0
{
   unsigned int j=0;
    int len,i;  
   if(S2CON & S2RI)
   {  
   len=(int)S2BUF;        
    S2CON &=~S2RI;
   for(i=0;i<len;i++)
   {
    while(!S2CON & S2RI)
    {
     j++;
     if(j>10000)
     {
        break;
     }
    }
    if(j<10000)
    {
     RevBuffer[i]=S2BUF;
     S2CON &= ~S2RI;
     j=0;
    }
    else
    {
       break;
    }
   }
   if(i==len)
   {
     S2CON |= S2REN;
    CmdValid=1;   
   }
  }
  else
  if(S2CON & S2TI)
  {
   S2CON &= ~S2TI;
   len=RevBuffer[0];
   for(i=0;i<len+1;i++)   //注意:此处只发送了一个命令字节,原来是for(i=0;i<len+1;i++)
   {
    S2BUF=RevBuffer[i];
    while(!S2CON & S2TI);
      S2CON &= ~S2TI;  
   }
   S2CON |= S2REN;
}
}
//执行下载操作
/*****************************/
void cmd_execution(void)
{
    unsigned char cmd,i;
   cmd = RevBuffer[0];
   switch(cmd)
   {
      case 0x0B:      
            LCD_Clr();//清除
//           Print(2,48,kaiti,&RevBuffer[1]);
              Print(4,32,kaiti,"连接成功!");
        CALL_isr_UART();        
              break;
       case 0xFC:      
             LCD_Clr();//清屏
             Print(2,40,kaiti,&RevBuffer[1]);
             Print(4,16,kaiti,"该卡未注册!");
             CALL_isr_UART() ;      
              break;   
      case 0xFA:
             LCD_Clr();//清屏
             Print(2,40,kaiti,&RevBuffer[1]);
             Print(4,16,kaiti,"该卡已挂失!");
             CALL_isr_UART() ;
              break;
     case 0xFE:   
               LCD_Clr();//清屏
             Print(2,48,kaiti,&RevBuffer[1]);
               Print(4,32,kaiti,"签到成功!");
                CALL_isr_UART() ;      
              break;
      case 0xFD:
               LCD_Clr();//清屏
             Print(2,40,kaiti,&RevBuffer[1]);
               Print(4,16,kaiti,"今天已签到!");
                CALL_isr_UART() ;                          
              break;   
      case 0xFF:   
               LCD_Clr();//清屏
             Print(2,40,kaiti,&RevBuffer[1]);
               Print(4,16,kaiti,"服务器断开!");
                CALL_isr_UART() ;
                break;
}     
}
void PortInit()
{
   P0M1 =0X00;
   P0M0 =0X00;
   P1M1 =0X00;
   P1M0 =0X00;////P1.2、P1.3强驱动模式,P1.2继电器,P1.3蜂鸣器
   P2M1 =0X00;
   P2M0 =0X00;
   P3M1 =0X00;
   P3M0 =0X00;
   P4M1 =0X00;
   P4M0 =0X00;
   P5M1 =0X00;
   P5M0 =0X00;
}
/*******************************************************************************/
void main(void) //主函数
{
Delaylong(500);
AUXR =0x00;
PortInit();
Uart2Init();

S2BUF=0Xaa;             //送入缓冲区
  while(!(S2CON & S2TI)); //等待发送完毕
S2CON &= ~S2TI;   
COG_Initialize();       //设置液晶显示器
  LCD_Clr();              //清屏

Delaylong(65500);
LCD_Clr();
// for(i=0;i<257;i++)
// {
//  RevBuffer[i]=0;
// }

Delaylong(50);
Print(2,32,kaiti,"欢迎使用");
Print(0,11,kaiti,"502嵌入实验室");
Print(4,32,kaiti,"签到系统");
Print(6,16,kaiti,"祝你学业有成");
  counter=0;
  faddress=0;

  EA =1;

  while(1)
  {
     if (CmdValid)
     {   
          CmdValid = FALSE;   
          cmd_execution();
          S2CON |= S2REN;
   }
   }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:323102 发表于 2018-12-5 19:26 | 只看该作者
你后来怎么解决的?
回复

使用道具 举报

板凳
ID:147114 发表于 2019-5-24 15:26 | 只看该作者
IE2 |= 0x01;改一下,改为IE2 |= 0x10;试试
回复

使用道具 举报

地板
ID:147114 发表于 2019-5-24 15:27 | 只看该作者
IE2 |= 0x01;改为IE2 |= 0x10;
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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