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

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1900

回帖

5218

积分

论坛元老

积分
5218
发表于 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要另加作他用,改了一个上午都没法实现目的。
请问大佬:用上述的哪一个来改比较容易些,并且该从哪个地方进行修改?


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1900

回帖

5218

积分

论坛元老

积分
5218
发表于 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. }
复制代码


支持 反对

送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1900

回帖

5218

积分

论坛元老

积分
5218
发表于 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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1900

回帖

5218

积分

论坛元老

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 15:07 , Processed in 0.177953 second(s), 75 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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