标题: 求教如何实现串口的转接 [打印本页]

作者: 辰99    时间: 2021-2-19 10:34
标题: 求教如何实现串口的转接
我使用的是STC15W4K56S4芯片,连接ESP8266。ESP8266连接的串口是P1^0和P1^1,与CH340连接的串口P3^0和P3^1不同。该怎么实现转接。

8266.png (18.91 KB, 下载次数: 46)

8266.png

CH340.png (34.63 KB, 下载次数: 54)

CH340.png

MCU.png (62.58 KB, 下载次数: 47)

MCU.png

作者: 辰99    时间: 2021-2-19 10:48
是为了解决发送AT指令,没有反应的问题。希望大佬们给点方法思路!
作者: devcang    时间: 2021-2-19 12:08

这是双串口的MCU,打开双串口(完整版的下载工具中有例子),速率相同,就可以通讯了
作者: 51hei**1140    时间: 2021-2-19 14:10
你好@
这两个串口是完全独立的,不能进行相互切换
作者: 辰99    时间: 2021-2-19 14:22
devcang 发表于 2021-2-19 12:08
这是双串口的MCU,打开双串口(完整版的下载工具中有例子),速率相同,就可以通讯了

这个芯片总共有四组串行口。
因为下载用的是P30和P31口,将3031收到的at指令再发过去(rx转tx2,rx2转tx)。我不知道该怎么编码。
作者: 辰99    时间: 2021-2-19 15:22
devcang 发表于 2021-2-19 12:08
这是双串口的MCU,打开双串口(完整版的下载工具中有例子),速率相同,就可以通讯了

这总共有四组串口。
下载读写用的是P30和P31,想将P30的RX转P11的tx2,P10的rx2转P31的tx。但不知道该怎么操作编码。
作者: 418854190    时间: 2021-2-19 16:19
不懂C语言  汇编转过P3.6 P3.7
想转哪个就调用哪个  用的是STC15W204S  试过用P3.0接收 P3.7发送   程序是在下载软件的范例程序里找的  源程序没用明白  把改串口的部分提取出来就行了


;串口P3.0_RX  P3.1_TX
RXTX30:   
    MOV   A,P_SW1;
    ANL   A,#03FH;               //S1_S0=0 S1_S1=0
    MOV   P_SW1,A;               //(P3.0/RxD, P3.1/TxD)
        RET;
;-----------------------
;串口P3.6_RX   P3.7_TX
RXTX36:
    MOV   A,P_SW1
    ANL   A,#03FH               //S1_S0=1 S1_S1=0
    ORL   A,#S1_S0              //(P3.6/RxD_2, P3.7/TxD_2)
    MOV   P_SW1,A
        RET;

作者: ygystc    时间: 2021-2-19 16:26
这两个串口是完全独立的,不能进行相互切换
作者: qq1974    时间: 2021-2-19 18:18
如果这个芯片有双串口,那就从芯片手册上去找,我记得stc的新芯片官方都给例程

作者: 辰99    时间: 2021-2-19 23:05
418854190 发表于 2021-2-19 16:19
不懂C语言  汇编转过P3.6 P3.7
想转哪个就调用哪个  用的是STC15W204S  试过用P3.0接收 P3.7发送   程序是 ...

好的 我看看
另外请问你说的下载软件的范例程序是哪里找的
作者: 黄youhui    时间: 2021-2-20 08:46
随便网上搜个STM32的ESP8266例程就好了,自己改一下

作者: cn_zhx    时间: 2021-2-21 15:24
你的问题描述的不太明白。
看看是不是这样:P30接收的数据从P11发送出去,相反,P10接收的数据从P31发送出去。如果是这样的话,写上两个不同串口的收发程序,透明发送出去就行。
作者: 辰99    时间: 2021-2-22 11:49
cn_zhx 发表于 2021-2-21 15:24
你的问题描述的不太明白。
看看是不是这样:P30接收的数据从P11发送出去,相反,P10接收的数据从P31发送出 ...

嗯对  是这个意思。 但串口3的收发程序编写不知道哪里错了,不能收发,能不能帮忙看看。
#include "stc15f2k60s2.h"            // 单片机STC15F2K60S2头文件,可以不再加入reg51.h
#include "uart.h"

sbit KEY1 = P2^0;
sbit KEY2 = P2^1;

#define S3RI 0x01 //S3CON.0
#define S3TI 0x02 //S3CON.1
#define ES3 0x08    //IE2.3

#define uchar unsigned char
#define uint unsigned int
unsigned char date;

void delay(uint z)
{                                                                                                                                                                                          
    uint i,j;
    for(i=z;i>0;i--)
        for(j=110;j>0;j--);
}
void UartInit(void);
void Uart3Init(void);
void main(void)
{
        //定时器
        TMOD = 0x00;//定时器0,模式0
        TH0=0x3c;//50ms定时器初值设定
        TL0=0xb0;
        TR0=1;
        ET0=1;
        EA=1;
        UartInit();
        Uart3Init();
        led1 = 1;
        led3 = 1;
        while(1)
        {
                if(KEY2==0)
                {
                        delay(1000);
                        if(KEY2==0)          //确认触发
                        {
                                SBUF = '1';
                                delay(100);
                        }
                        if(KEY1==0)
                        {
                        delay(1000);
                                if(KEY1==0)          //确认触发
                                {
                                        S3BUF='2';
                                        delay(100);
                                }
                        }
                }
        }
}
void uart1ISR() interrupt 4
{
        if(RI){
                        date=SBUF;    //单片机接受
                        SBUF=date;    //单片机发送
                        RI=0;
                  }
                        if(TI){
                                TI=0;
                        }
}

void UART3_Isr(void) interrupt 17
{
        if (S3CON & S3RI)    {
                  date = S3BUF;
                        S3BUF = date;
                       
      S3CON &= ~S3RI;         // 清中断标志
        }
    if (S3CON & S3TI)    {
      S3CON &= ~S3TI;         // 清中断标志
                       
    }
}
void Uart3Init(void)
{
//        S3CON  = 0x10;                // 8位数据,可变波特率
//        T2L=(65536-11059200/4/9600);     
//  T2H=(65536-11059200/4/9600)>>8;
//        AUXR = 0x14;                //定时器2时钟为Fosc,即1T
//        IE2=0x08;       // 使能串口中断
//        EA = 1;         // 开总中断
        S3CON  = 0x10;                // 8位数据,可变波特率
        AUXR  |= 0x04;                // 定时器2时钟为Fosc,即1T
        T2L    = (65536-11059200/4/9600);       
        T2H    = (65536-11059200/4/9600)>>8;                // 设定定时初值
        AUXR  |= 0x10;                // 启动定时器2
        IE2    = ES3;       // 使能串口中断
        EA     = 1;         // 开总中断
}
void UartInit(void)                //9600bps
{

/*        SCON = 0x50;                //8位数据,可变波特率
//        AUXR = 0x15;                //定时器2时钟为Fosc,即1T
  T2L=(65536-11059200/4/9600);     
  T2H=(65536-11059200/4/9600)>>8;       
        ET1 = 0;                        //禁止定时器1中断
        ES=1;*/
        SCON  = 0x50;                // 8位数据,可变波特率
        AUXR |= 0x40;                // 定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                // 串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                // 设定定时器1为16位自动重装方式
        TL1   = (65536-11059200/4/9600);                // 设定定时初值
        TH1   = (65536-11059200/4/9600)>>8;                // 设定定时初值
        ET1   = 0;                    // 禁止定时器1中断
        TR1   = 1;                    // 启动定时器1
        ES    = 1;          // 开串口中断
        EA    = 1;          // 开总中断
}
作者: 人人学会单片机    时间: 2021-2-22 20:47
这点东西也很难吗?开个数组存起来不就行了

作者: 湖南    时间: 2021-3-10 00:22
通过USB转TTL




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1