找回密码
 立即注册

RMB1.05, 8H2K12U做USB转串口,如何兼容340的通信协议 | 已成功

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:78
  • 最近打卡:2026-06-29 10:44:00

0

主题

6

回帖

144

积分

注册会员

积分
144
发表于 2026-6-3 16:26:08 | 显示全部楼层
erci*** 发表于 2026-6-3 15:06
不存在这样的限制

串口1发送就没问题?是谁给谁发卡死?如何判断的卡死?USB抓包停在哪个阶段?发太快主 ...

测试你的代码用的串口1不会有卡死现象,就把uart文件所有关于串口1的全部换成串口2,发个10来次就卡死,现象为串口工具点都点不动了


/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com  -----------------------------------------*/
/* --- QQ:  800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序            */
/*---------------------------------------------------------------------*/

#include "stc.h"
#include "uart.h"
#include "usb.h"
#include "usb_req_class.h"

BOOL UartBusy;

void uart_init()
{       
        P_SW2 &= ~0x01;                                        //UART2/USART2: RxD2(P1.0), TxD2(P1.1)
        S2CON = (S2CON & 0x3f) | 0x40;
        AUXR |= 0x04;                                        //定时器时钟1T模式
    T2L = BR(115200);                           
    T2H = BR(115200) >> 8;
    AUXR |= T2R;                    //启动定时器
    IE2 |= ES2;                     //使能串口中断
        S2CON |= S2REN;                                        //允许接收

    LineCoding.dwDTERate = 0x00c20100;  //115200
    LineCoding.bCharFormat = 0;
    LineCoding.bParityType = 0;
    LineCoding.bDataBits = 8;
}

void UART2_Isr() interrupt UART2_VECTOR
{
    if (S2CON & 0x02)
    {
        S2CON &= ~0x02;                         //清中断标志
        TxBuffer[TxWptr++] = S2BUF;
    }
    if (S2CON & 0x01)
    {
        S2CON &= ~0x01;                         //清中断标志
        UartBusy = 0;
    }
}


void uart_set_parity(BYTE parity)
{

        switch (parity)
        {
        default:
        case NONE_PARITY:
            S2CON = 0x50;
            break;
        case ODD_PARITY:
        case EVEN_PARITY:
        case MARK_PARITY:
            S2CON = 0xd8;
            break;
        case SPACE_PARITY:
            S2CON = 0xd0;
            break;
        }
}
void uart_set_baud(DWORD baud)
{
    WORD temp;
        temp = (WORD)BR(baud);
    T2L = temp;
    T2H = temp >> 8;
}

void uart_polling()
{
    BYTE dat;
    BYTE cnt;

    if (DeviceState != DEVSTATE_CONFIGURED)  //如果USB配置没有完成,就直接退出
        return;

    if (!UsbInBusy && (TxRptr != TxWptr))
    {
        IE2 &= ~0x80;   //EUSB = 0;
        UsbInBusy = 1;
        usb_write_reg(INDEX, 2);
        cnt = 0;
        while (TxRptr != TxWptr)
        {
            usb_write_reg(FIFO2, TxBuffer[TxRptr++]);
            cnt++;
            if (cnt == EP2IN_SIZE) break;
        }
        usb_write_reg(INCSR1, INIPRDY);
        IE2 |= 0x80;    //EUSB = 1;
    }

    if (!UartBusy && (RxRptr != RxWptr))
    {
        dat = RxBuffer[RxRptr++];
        UartBusy = 1;
        switch (LineCoding.bParityType)
        {
        case NONE_PARITY:
        case SPACE_PARITY:
//            TB8 = 0;
                        S2CON &= ~S2TB8;
            break;
        case ODD_PARITY:
            ACC = dat;
//            TB8 = !P;
                        if(!P)
                                S2CON |= S2TB8;
                        else
                                S2CON &= ~S2TB8;
            break;
        case EVEN_PARITY:
            ACC = dat;
//                        TB8 = P;
                        if(P)
                                S2CON |= S2TB8;
                        else
                                S2CON &= ~S2TB8;
            
            break;
        case MARK_PARITY:
//            TB8 = 1;
                        S2CON |= S2TB8;
            break;
        }
        S2BUF = dat;

        while (UartBusy);
    }


    if (UsbOutBusy)
    {
        IE2 &= ~0x80;   //EUSB = 0;
        if ((BYTE)(RxWptr - RxRptr) < (BYTE)(256 - EP2OUT_SIZE))
        {
            UsbOutBusy = 0;
            usb_write_reg(INDEX, 2);
            usb_write_reg(OUTCSR1, 0);
        }
        IE2 |= 0x80;    //EUSB = 1;
    }

}


回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:78
  • 最近打卡:2026-06-29 10:44:00

0

主题

6

回帖

144

积分

注册会员

积分
144
发表于 2026-6-3 16:32:12 | 显示全部楼层
erci*** 发表于 2026-6-3 15:06
不存在这样的限制

串口1发送就没问题?是谁给谁发卡死?如何判断的卡死?USB抓包停在哪个阶段?发太快主 ...

/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com  -----------------------------------------*/
/* --- QQ:  800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序            */
/*---------------------------------------------------------------------*/

#include "stc.h"
#include "uart.h"
#include "usb.h"
#include "usb_req_class.h"

BOOL UartBusy;

void uart_init()
{       
        P_SW2 &= ~0x01;                                        //UART2/USART2: RxD2(P1.0), TxD2(P1.1)
        S2CON = (S2CON & 0x3f) | 0x40;
        AUXR |= 0x04;                                        //定时器时钟1T模式
    T2L = BR(115200);                           
    T2H = BR(115200) >> 8;
    AUXR |= T2R;                    //启动定时器
    IE2 |= ES2;                     //使能串口中断
        S2CON |= S2REN;                                        //允许接收

    LineCoding.dwDTERate = 0x00c20100;  //115200
    LineCoding.bCharFormat = 0;
    LineCoding.bParityType = 0;
    LineCoding.bDataBits = 8;
}

void UART2_Isr() interrupt UART2_VECTOR
{
    if (S2CON & 0x02)
    {
        S2CON &= ~0x02;                         //清中断标志
        TxBuffer[TxWptr++] = S2BUF;
    }
    if (S2CON & 0x01)
    {
        S2CON &= ~0x01;                         //清中断标志
        UartBusy = 0;
    }
}


void uart_set_parity(BYTE parity)
{

        switch (parity)
        {
        default:
        case NONE_PARITY:
            S2CON = 0x50;
            break;
        case ODD_PARITY:
        case EVEN_PARITY:
        case MARK_PARITY:
            S2CON = 0xd8;
            break;
        case SPACE_PARITY:
            S2CON = 0xd0;
            break;
        }
}
void uart_set_baud(DWORD baud)
{
    WORD temp;
        temp = (WORD)BR(baud);
    T2L = temp;
    T2H = temp >> 8;
}

void uart_polling()
{
    BYTE dat;
    BYTE cnt;

    if (DeviceState != DEVSTATE_CONFIGURED)  //如果USB配置没有完成,就直接退出
        return;

    if (!UsbInBusy && (TxRptr != TxWptr))
    {
        IE2 &= ~0x80;   //EUSB = 0;
        UsbInBusy = 1;
        usb_write_reg(INDEX, 2);
        cnt = 0;
        while (TxRptr != TxWptr)
        {
            usb_write_reg(FIFO2, TxBuffer[TxRptr++]);
            cnt++;
            if (cnt == EP2IN_SIZE) break;
        }
        usb_write_reg(INCSR1, INIPRDY);
        IE2 |= 0x80;    //EUSB = 1;
    }

    if (!UartBusy && (RxRptr != RxWptr))
    {
        dat = RxBuffer[RxRptr++];
        UartBusy = 1;
        switch (LineCoding.bParityType)
        {
        case NONE_PARITY:
        case SPACE_PARITY:
//            TB8 = 0;
                        S2CON &= ~S2TB8;
            break;
        case ODD_PARITY:
            ACC = dat;
//            TB8 = !P;
                        if(!P)
                                S2CON |= S2TB8;
                        else
                                S2CON &= ~S2TB8;
            break;
        case EVEN_PARITY:
            ACC = dat;
//                        TB8 = P;
                        if(P)
                                S2CON |= S2TB8;
                        else
                                S2CON &= ~S2TB8;
            
            break;
        case MARK_PARITY:
//            TB8 = 1;
                        S2CON |= S2TB8;
            break;
        }
        S2BUF = dat;

        while (UartBusy);
    }


    if (UsbOutBusy)
    {
        IE2 &= ~0x80;   //EUSB = 0;
        if ((BYTE)(RxWptr - RxRptr) < (BYTE)(256 - EP2OUT_SIZE))
        {
            UsbOutBusy = 0;
            usb_write_reg(INDEX, 2);
            usb_write_reg(OUTCSR1, 0);
        }
        IE2 |= 0x80;    //EUSB = 1;
    }

}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:316
  • 最近打卡:2026-07-04 08:25:57

18

主题

261

回帖

345

积分

中级会员

积分
345
发表于 2026-6-6 17:11:39 | 显示全部楼层
erci*** 发表于 2025-5-9 08:47
根据楼上网友的开源USB转串口程序,
使用STC通用USB型MCU做USB转串口,
兼容CH340的通信协议,已测试成功,

大佬,我也想要一个8脚8H2K12U转340协议的,跪求更新一个转串口2的
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:316
  • 最近打卡:2026-07-04 08:25:57

18

主题

261

回帖

345

积分

中级会员

积分
345
发表于 2026-6-9 08:18:48 | 显示全部楼层
duan*** 发表于 2026-6-3 16:26
测试你的代码用的串口1不会有卡死现象,就把uart文件所有关于串口1的全部换成串口2,发个10来次就卡死,现 ...

你的调好了没
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:78
  • 最近打卡:2026-06-29 10:44:00

0

主题

6

回帖

144

积分

注册会员

积分
144
发表于 6 天前 | 显示全部楼层

反正就是会卡死,我对USB不熟,你问问论坛其它高手呗
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:316
  • 最近打卡:2026-07-04 08:25:57

18

主题

261

回帖

345

积分

中级会员

积分
345
发表于 6 天前 | 显示全部楼层
duan*** 发表于 2026-6-29 10:44
反正就是会卡死,我对USB不熟,你问问论坛其它高手呗

我对USB也不熟,会卡死,那就不能用
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-5 15:42 , Processed in 0.073378 second(s), 71 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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