找回密码
 立即注册
查看: 185|回复: 4

USB转双串口例程如何改回单串口,只使用P36P37?| 已解决

[复制链接]
  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 173 天

    [LV.7]常住居民III

    67

    主题

    861

    回帖

    2890

    积分

    金牌会员

    积分
    2890
    发表于 2024-1-29 11:15:32 | 显示全部楼层 |阅读模式
    例程 STC-USB-TO-2UART-TINY-STC8H8K64U-20231101\12-CDC(Communication Device Class)协议范例 - USB-CDC转单串口,
    使用的串口端口是P10P11。
    而例程 “A1, USB CDC转双串口开源程序 - 做自动停电上电烧录器”,
    使用的双串口端口分别是P10P11和P36P37。
    现在想改回单串口,并且只使用P36P37,P10P11要另加作他用,改了一个上午都没法实现目的。
    请问大佬:用上述的哪一个来改比较容易些,并且该从哪个地方进行修改?


    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 173 天

    [LV.7]常住居民III

    67

    主题

    861

    回帖

    2890

    积分

    金牌会员

    积分
    2890
     楼主| 发表于 2024-1-29 11:27:49
    uart.c

    1. /*---------------------------------------------------------------------*/
    2. /* --- STC MCU Limited ------------------------------------------------*/
    3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/
    4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
    5. /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
    6. /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
    7. /* --- Web: www.STCAI.com ---------------------------------------------*/
    8. /* --- BBS: www.STCAIMCU.com  -----------------------------------------*/
    9. /* --- QQ:  800003751 -------------------------------------------------*/
    10. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
    11. /*---------------------------------------------------------------------*/
    12. #include "stc.h"
    13. #include "uart.h"
    14. #include "usb.h"
    15. #include "util.h"
    16. #include "usb_req_class.h"
    17. BOOL UartBusy;
    18. void uart_init()
    19. {
    20.     P_SW1 |= 0x40;
    21.     P3M0 = 0x00; // P3.0,P3.1设置为准双向模式
    22.     P3M1 = 0x00;
    23.     AUXR |= 0x14; // 定时器2时钟1T模式,开始计时
    24.     IE2 |= 1;     // 允许中断
    25.     SCON = 0x50;  // 8位数据,可变波特率
    26.     AUXR |= 0x01; // 串口1选择定时器2为波特率发生器
    27.     AUXR |= 0x04; // 定时器时钟1T模式
    28.     T2L = BR(115200);
    29.     T2H = BR(115200) >> 8;
    30.     AUXR |= 0x10; // 定时器2开始计时
    31.     LineCoding.dwDTERate = REV4(115200);
    32.     LineCoding.bCharFormat = 0;
    33.     LineCoding.bParityType = 0;
    34.     LineCoding.bDataBits = 8;
    35. }
    36. void uart1_isr() interrupt 4
    37. {
    38.     if (TI) // 检测串口1发送中断
    39.     {
    40.         TI = 0; // 清除串口1发送中断请求位
    41.         UartBusy = 0;
    42.     }
    43.     if (RI) // 检测串口1接收中断
    44.     {
    45.         RI = 0; // 清除串口1接收中断请求位
    46.         TxBuffer[TxWptr++] = S2BUF;
    47.     }
    48. }
    49. void uart_set_parity(BYTE parity)
    50. {
    51.     switch (parity)
    52.     {
    53.     case NONE_PARITY:
    54.         SCON = 0x50;
    55.         break;
    56.     case ODD_PARITY:
    57.     case EVEN_PARITY:
    58.     case MARK_PARITY:
    59.         SCON = 0xda;
    60.         break;
    61.     case SPACE_PARITY:
    62.         SCON = 0xd2;
    63.         break;
    64.     }
    65. }
    66. void uart_set_baud(DWORD baud)
    67. {
    68.     WORD temp;
    69.     temp = (WORD)BR(baud);
    70.     T2L = temp;
    71.     T2H = temp >> 8;
    72. }
    73. void uart_polling()
    74. {
    75.     BYTE dat;
    76.     BYTE cnt;
    77.     if (DeviceState != DEVSTATE_CONFIGURED)
    78.         return;
    79.     if (!UsbInBusy && (TxRptr != TxWptr))
    80.     {
    81.         IE2 &= ~0x80; // EUSB = 0;
    82.         UsbInBusy = 1;
    83.         usb_write_reg(INDEX, 1);
    84.         cnt = 0;
    85.         while (TxRptr != TxWptr)
    86.         {
    87.             usb_write_reg(FIFO1, TxBuffer[TxRptr++]);
    88.             cnt++;
    89.             if (cnt == EP1IN_SIZE)
    90.                 break;
    91.         }
    92.         usb_write_reg(INCSR1, INIPRDY);
    93.         IE2 |= 0x80; // EUSB = 1;
    94.     }
    95.     if (!UartBusy && (RxRptr != RxWptr))
    96.     {
    97.         dat = RxBuffer[RxRptr++];
    98.         UartBusy = 1;
    99.         switch (LineCoding.bParityType)
    100.         {
    101.         case NONE_PARITY:
    102.         case SPACE_PARITY:
    103.             SCON &= ~0x08; // STB8 = 0;
    104.             break;
    105.         case ODD_PARITY:
    106.             ACC = dat;
    107.             if (P)
    108.                 SCON &= ~0x08; // STB8 = !P;
    109.             else
    110.                 SCON |= 0x08;
    111.             break;
    112.         case EVEN_PARITY:
    113.             ACC = dat;
    114.             if (P)
    115.                 SCON |= 0x08; // STB8 = P;
    116.             else
    117.                 SCON &= ~0x08;
    118.             break;
    119.         case MARK_PARITY:
    120.             SCON |= 0x08; // STB8 = 1;
    121.             break;
    122.         }
    123.         SBUF = dat;
    124.         while (UartBusy)
    125.             ;
    126.     }
    127.     if (UsbOutBusy)
    128.     {
    129.         IE2 &= ~0x80; // EUSB = 0;
    130.         if (RxWptr - RxRptr < 256 - EP1OUT_SIZE)
    131.         {
    132.             UsbOutBusy = 0;
    133.             usb_write_reg(INDEX, 1);
    134.             usb_write_reg(OUTCSR1, 0);
    135.         }
    136.         IE2 |= 0x80; // EUSB = 1;
    137.     }
    138. }
    复制代码


    支持 反对 送花

    该用户从未签到

    552

    主题

    9494

    回帖

    1万

    积分

    管理员

    积分
    14063
    发表于 2024-1-29 11:35:58 | 显示全部楼层
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    552

    主题

    9494

    回帖

    1万

    积分

    管理员

    积分
    14063
    发表于 2024-1-29 11:39:07 | 显示全部楼层
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 173 天

    [LV.7]常住居民III

    67

    主题

    861

    回帖

    2890

    积分

    金牌会员

    积分
    2890
     楼主| 发表于 2024-1-29 11:39:34 | 显示全部楼层
    本帖最后由 xxkj2010 于 2024-1-29 11:41 编辑


    uart.c修改后的代码如下,但仍然尚未正常。
    1. #include "stc.h"
    2. #include "uart.h"
    3. #include "usb.h"
    4. #include "util.h"
    5. #include "usb_req_class.h"
    6. BOOL UartBusy;
    7. void uart_init()
    8. {
    9.     P_SW1 |= 0x40;
    10.     P3M0 = 0x00; // P3.6,P3.7设置为准双向模式
    11.     P3M1 = 0x00;
    12.     AUXR |= 0x14; // 定时器2时钟1T模式,开始计时
    13.     IE2 |= 1;     // 允许中断
    14.     SCON = 0x50;  // 8位数据,可变波特率
    15.     AUXR |= 0x01; // 串口1选择定时器2为波特率发生器
    16.     AUXR |= 0x04; // 定时器时钟1T模式
    17.     T2L = BR(115200);
    18.     T2H = BR(115200) >> 8;
    19.     AUXR |= 0x10; // 定时器2开始计时
    20.     ES = 1;
    21.     LineCoding.dwDTERate = REV4(115200);
    22.     LineCoding.bCharFormat = 0;
    23.     LineCoding.bParityType = 0;
    24.     LineCoding.bDataBits = 8;
    25. }
    26. void uart1_isr() interrupt 4
    27. {
    28.     if (TI) // 检测串口1发送中断
    29.     {
    30.         TI = 0; // 清除串口1发送中断请求位
    31.         UartBusy = 0;
    32.     }
    33.     if (RI) // 检测串口1接收中断
    34.     {
    35.         RI = 0; // 清除串口1接收中断请求位
    36.         TxBuffer[TxWptr++] = S2BUF;
    37.     }
    38. }
    39. void uart_set_parity(BYTE parity)
    40. {
    41.     switch (parity)
    42.     {
    43.     case NONE_PARITY:
    44.         SCON = 0x50;
    45.         break;
    46.     case ODD_PARITY:
    47.     case EVEN_PARITY:
    48.     case MARK_PARITY:
    49.         SCON = 0xda;
    50.         break;
    51.     case SPACE_PARITY:
    52.         SCON = 0xd2;
    53.         break;
    54.     }
    55. }
    56. void uart_set_baud(DWORD baud)
    57. {
    58.     WORD temp;
    59.     temp = (WORD)BR(baud);
    60.     T2L = temp;
    61.     T2H = temp >> 8;
    62. }
    63. void uart_polling()
    64. {
    65.     BYTE dat;
    66.     BYTE cnt;
    67.     if (DeviceState != DEVSTATE_CONFIGURED)
    68.         return;
    69.     if (!UsbInBusy && (TxRptr != TxWptr))
    70.     {
    71.         IE2 &= ~0x80; // EUSB = 0;
    72.         UsbInBusy = 1;
    73.         usb_write_reg(INDEX, 1);
    74.         cnt = 0;
    75.         while (TxRptr != TxWptr)
    76.         {
    77.             usb_write_reg(FIFO1, TxBuffer[TxRptr++]);
    78.             cnt++;
    79.             if (cnt == EP1IN_SIZE)
    80.                 break;
    81.         }
    82.         usb_write_reg(INCSR1, INIPRDY);
    83.         IE2 |= 0x80; // EUSB = 1;
    84.     }
    85.     if (!UartBusy && (RxRptr != RxWptr))
    86.     {
    87.         dat = RxBuffer[RxRptr++];
    88.         UartBusy = 1;
    89.         switch (LineCoding.bParityType)
    90.         {
    91.         case NONE_PARITY:
    92.         case SPACE_PARITY:
    93.             SCON &= ~0x08; // STB8 = 0;
    94.             break;
    95.         case ODD_PARITY:
    96.             ACC = dat;
    97.             if (P)
    98.                 SCON &= ~0x08; // STB8 = !P;
    99.             else
    100.                 SCON |= 0x08;
    101.             break;
    102.         case EVEN_PARITY:
    103.             ACC = dat;
    104.             if (P)
    105.                 SCON |= 0x08; // STB8 = P;
    106.             else
    107.                 SCON &= ~0x08;
    108.             break;
    109.         case MARK_PARITY:
    110.             SCON |= 0x08; // STB8 = 1;
    111.             break;
    112.         }
    113.         SBUF = dat;
    114.         while (UartBusy)
    115.             ;
    116.     }
    117.     if (UsbOutBusy)
    118.     {
    119.         IE2 &= ~0x80; // EUSB = 0;
    120.         if (RxWptr - RxRptr < 256 - EP1OUT_SIZE)
    121.         {
    122.             UsbOutBusy = 0;
    123.             usb_write_reg(INDEX, 1);
    124.             usb_write_reg(OUTCSR1, 0);
    125.         }
    126.         IE2 |= 0x80; // EUSB = 1;
    127.     }
    128. }
    复制代码




    现在的问题是这样的:从CDC发送出去的数据正常,但从另一个串口向USB-CDC发送数据,CDC接收不正常,只显示几个00,不知道需要再修改哪个地方。
    截图202401291138122242.jpg

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 173 天

    [LV.7]常住居民III

    67

    主题

    861

    回帖

    2890

    积分

    金牌会员

    积分
    2890
     楼主| 发表于 2024-1-29 11:45:51 | 显示全部楼层
    哦,发现问题了,改好了改好了。
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-18 16:51 , Processed in 0.069046 second(s), 52 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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