stc15吧 关注:55贴子:49
  • 4回复贴,共1

stc15w4k56s4怎么才能做到串口2接收数据再由串口1发送出去呢

只看楼主收藏回复

stc15w4k56s4怎么才能做到串口2接收数据再由串口1发送出去呢


IP属地:河北1楼2018-01-17 22:02回复
    没用个2个串口呢,现在只会1个口,回去研究研究,谢谢你提供的课题。


    IP属地:辽宁2楼2018-02-03 10:51
    回复
      我找到串口2了 但手里只有1个编程器,只能连1个串口,我写了1个同时自动向两个串口发送相同数据的程序,仅供参考。我的是STC15F2K60S2 应该和你的通用 主函数内屏蔽掉的程序是串口1接收部分,应该很好改成你要的方式,不知道你是要求1进2出,还是2进1出,还是双向都存在!
      /*******************************************************************************************
      * RS485通信试验(发送) *
      * *
      * CPU:STC15F2K60S2 115200,N,8,1 @11.0592M *
      **
      *接收信号并经过处理后反馈 *
      *********************************************************************************************/
      #include <REG52.H>
      #include <STDIO.H>
      #include <INTRINS.H>
      #define U8 unsigned char
      #define U16 unsigned int
      #define U32 unsigned long
      sfr AUXR = 0x8e; //辅助寄存器
      sfr T2H = 0xd6; //定时器2高8位
      sfr T2L = 0xd7; //定时器2低8位
      sfr P5 = 0xC8;
      sfr S2BUF = 0x9B;
      sfr IE2 = 0xaf;
      sfr S2CON = 0x9a;
      sbit DIR = P3^2; //定义485的使能脚
      sbit DIR2 = P3^3;
      #define S2RI 0x01 //S2CON.0
      #define S2TI 0x02 //S2CON.1
      bit flagTxd = 0; //单字节发送完成标志,用来替代TXD中断标志位
      bit flagTxd2 = 0;
      U8 cntRxd = 0; //接收字节计数器
      U8 cntRxd2 = 0;
      U8 flagRxd = 0;//收到新字节标志
      U8 flagRxd2 = 0;
      U8 pdata bufRxd[64]; //接收字节缓冲区
      U8 pdata bufRxd2[64];
      /**************************************
      延时程序
      **************************************/
      void Delay1ms()//@11.0592MHz
      {
      unsigned char i, j;
      _nop_();
      _nop_();
      _nop_();
      i = 11;
      j = 190;
      do
      {
      while (--j);
      } while (--i);
      }
      void Delay(unsigned int i)
      {
      do
      {
      Delay1ms();
      }while (--i);
      }
      /**************************************
      串口初始化程序
      **************************************/
      void UartInit(void)//9600bps@11.0592MHz
      {
      SCON = 0x50;//8位数据,可变波特率
      S2CON =0X50;
      AUXR |= 0x01;//串口1选择定时器2为波特率发生器
      AUXR |= 0x04;//定时器2时钟为Fosc,即1T
      T2L = 0xE8;//设定定时初值
      T2H = 0xFF;//设定定时初值
      AUXR |= 0x10;//启动定时器2
      ES = 1; //使能串口1中断
      IE2 = 0x01; //使能串口2中断
      EA = 1;
      }
      /* 串口数据写入,即串口发送函数,buf-待发送数据的指针,len-指定的发送长度 */
      void UartWrite(U8 *buf, U8 len)
      {
      DIR = 1; //RS485设置为发送
      while (len--) //循环发送所有字节
      {
      flagTxd = 0; //清零发送标志
      SBUF = *buf++; //发送一个字节数据//S2BUF
      while (!flagTxd); //等待该字节发送完成
      }
      Delay(1); //等待最后的停止位完成
      DIR = 0; //RS485设置为接收
      }
      void UartWrite2(U8 *buf, U8 len)
      {
      DIR2 = 1; //RS485设置为发送
      while (len--) //循环发送所有字节
      {
      flagTxd2 = 0; //清零发送标志
      S2BUF = *buf++; //发送一个字节数据//S2BUF
      while (!flagTxd2); //等待该字节发送完成
      }
      Delay(1); //等待最后的停止位完成
      DIR2 = 0; //RS485设置为接收
      }
      void main (void) {
      U8 pdata Data[64]; //接收字节缓冲区
      //U8 i;
      UartInit();
      Data[0]=0;
      while(1)
      { Data[0]++;
      /* DIR = 0;
      if (flagRxd==1)
      {
      Delay(5);
      for (i=0;i<cntRxd;i++)
      {
      Data[i]=bufRxd[i];
      }
      UartWrite(Data,cntRxd);
      cntRxd=0;
      flagRxd=0;
      } */
      UartWrite(Data,1);
      Delay(100);
      UartWrite2(Data,1);
      Delay(900);
      }
      }
      /* 串口中断服务函数 */
      void InterruptUART() interrupt 4
      {
      if (RI) //接收到新字节
      {
      RI = 0; //清零接收中断标志位
      flagRxd=1;
      if (cntRxd < sizeof(bufRxd)) //接收缓冲区尚未用完时,
      { //保存接收字节,并递增计数器
      bufRxd[cntRxd++] = SBUF;
      }
      }
      if (TI) //字节发送完毕
      {
      TI = 0; //清零发送中断标志位
      flagTxd = 1; //设置字节发送完成标志
      }
      }
      void InterruptUART2() interrupt 8
      {
      if (S2CON & S2RI) //接收到新字节
      {
      S2CON &= ~S2RI; //清零接收中断标志位
      }
      if (S2CON & S2TI) //字节发送完毕
      {
      S2CON &= ~S2TI; //清零发送中断标志位
      flagTxd2 = 1; //设置字节发送完成标志
      }
      }


      IP属地:辽宁3楼2018-02-03 13:26
      回复


        IP属地:辽宁4楼2018-02-04 10:25
        回复
          问一下cntRxd < sizeof(bufRxd)中cntRxd和sizeof(bufRxd)不都是0吗,怎么执行后面的语句呀


          IP属地:山东来自iPhone客户端5楼2019-12-24 14:03
          回复