找回密码
 立即注册
查看: 1455|回复: 12

遇到串口4奇怪的问题

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:186
  • 最近打卡:2025-03-06 09:49:49

14

主题

133

回帖

1149

积分

金牌会员

积分
1149
发表于 2024-2-29 10:30:49 | 显示全部楼层 |阅读模式
想同时使用4个串口,串口1,2都很好调试,串口3,4没调通。
所以单独做了一个串口3,4的程序。
串口3可以正常收发数据;
串口4可以正常发送数据,接收到字符后再发出就出现错误。使用芯片STC8H4K64TLR。

具体代码如文件,具体是什么问题呢?
Uart3_E.c (7.29 KB, 下载次数: 99)





回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:186
  • 最近打卡:2025-03-06 09:49:49

14

主题

133

回帖

1149

积分

金牌会员

积分
1149
发表于 2024-2-29 10:32:49 | 显示全部楼层
  1. <div class="blockcode"><blockquote>#include <STC8H.h>
  2. #include <stdio.h>
  3. #include "intrins.h"
  4. //========================================================================
  5. //                           数据类型定义
  6. //========================================================================
  7. typedef unsigned char   u8;     //  8 bits
  8. typedef unsigned int    u16;    // 16 bits
  9. typedef unsigned long   u32;    // 32 bits
  10. typedef signed char     int8;   //  8 bits
  11. typedef signed int      int16;  // 16 bits
  12. typedef signed long     int32;  // 32 bits
  13. typedef unsigned char   uint8;  //  8 bits
  14. typedef unsigned int    uint16; // 16 bits
  15. typedef unsigned long   uint32; // 32 bits
  16. #define MAIN_Fosc        22118400L        //定义主时钟                // 11059200UL
  17. #define UART3_BRT         (65536 - MAIN_Fosc / 115200 / 4)
  18. #define UART4_BRT         (65536 - MAIN_Fosc/ 115200 / 4)
  19. #define COM3_BUF_LENGTH        64
  20. #define COM4_BUF_LENGTH        128
  21. bit B_COM3_Tx_Busy;
  22. u16 COM3_Rx_Cnt;
  23. u16 COM3_Tx_Cnt;
  24. u8 xdata COM3_Rx_Buffer[COM3_BUF_LENGTH];
  25. bit B_COM4_Tx_Busy;
  26. u16 COM4_Rx_Cnt;
  27. u16 COM4_Tx_Cnt;
  28. u8 xdata COM4_Rx_Buffer[COM4_BUF_LENGTH];
  29. void UART3_Isr() interrupt 17
  30. {
  31.     if (S3CON & 0x02)
  32.     {
  33.         S3CON &= ~0x02;
  34.         B_COM3_Tx_Busy = 0;
  35.     }
  36.     if (S3CON & 0x01)
  37.     {
  38.         S3CON &= ~0x01;
  39.                 COM3_Rx_Buffer[COM3_Rx_Cnt] = S3BUF;       
  40.         if(++COM3_Rx_Cnt >= COM3_BUF_LENGTH - 1)   COM3_Rx_Cnt = 0;    //防溢出
  41.                 COM3_Rx_Buffer[COM3_Rx_Cnt] = 0;
  42.     }
  43. }
  44. void Uart3_Init()
  45. {
  46.     S3CON = 0x50;
  47.     T3L = UART3_BRT;
  48.     T3H = UART3_BRT >> 8;
  49.     T4T3M |= 0x0A;
  50.        
  51.         IE2 |= 0x08;
  52.        
  53.     COM3_Rx_Cnt = 0;
  54.     COM3_Tx_Cnt= 0;
  55.     B_COM3_Tx_Busy = 0;
  56. }
  57. // -------- 串口3 发送字符串 -------------------------------------------
  58. void COM3_PrintString(unsigned char *puts)                //发送一个字符串
  59. {
  60.         for (; *puts != 0;  puts++)     //遇到停止符0结束
  61.     {
  62.         S3BUF = *puts;
  63.         B_COM3_Tx_Busy = 1;
  64.         while(B_COM3_Tx_Busy);
  65.     }
  66. }
  67. void Uart3_SendChar(char dat)
  68. {
  69.     while (B_COM3_Tx_Busy);
  70.     B_COM3_Tx_Busy = 1;
  71.     S3BUF = dat;
  72. }
  73. void Uart3_SendStr(char *p)
  74. {
  75.     while (*p)
  76.     {
  77.         Uart3_SendChar(*p++);
  78.     }
  79. }
  80. void Uart4_Isr() interrupt 18
  81. {
  82.     if (S4CON & 0x02)                //        ((S4CON & 0x02) != 0)
  83.     {
  84.         S4CON &= ~0x02;
  85.         B_COM4_Tx_Busy = 0;
  86.     }
  87.     if ((S4CON & 0x01) != 0)                //        (S4CON & 0x01)
  88.     {
  89.         S4CON &= ~0x01;
  90.                 COM4_Rx_Buffer[COM4_Rx_Cnt] = S4BUF;       
  91.         if(++COM4_Rx_Cnt >= COM4_BUF_LENGTH - 1)   COM4_Rx_Cnt = 0;    //防溢出
  92.                 COM4_Rx_Buffer[COM4_Rx_Cnt] = 0;
  93.     }
  94. }
  95. void Uart4_Init()
  96. {
  97.     S4CON = 0x50;
  98.     T4L = UART4_BRT;
  99.     T4H = UART4_BRT >> 8;
  100.         T4T3M |= 0xA0;
  101.         IE2 |= 0x10;
  102.        
  103.     COM4_Rx_Cnt = 0;
  104.     COM4_Tx_Cnt= 0;
  105.     B_COM4_Tx_Busy = 0;
  106. }
  107. void COM4_PrintString(unsigned char *puts)                //发送一个字符串
  108. {
  109.         for (; *puts != 0;  puts++)     //遇到停止符0结束
  110.     {
  111.         S4BUF = *puts;
  112.         B_COM4_Tx_Busy = 1;
  113.         while(B_COM4_Tx_Busy);
  114.     }
  115. }
  116. void Uart4_SendChar(char dat)
  117. {
  118.     while (B_COM4_Tx_Busy);
  119.     B_COM4_Tx_Busy = 1;
  120.     S4BUF = dat;
  121. }
  122. void Uart4_SendStr(char *p)
  123. {
  124.     while (*p)
  125.     {
  126.         Uart4_SendChar(*p++);
  127.     }
  128. }
  129. void GPIO_Init(void)                // 管脚状态初始化
  130. {
  131. // I/O口工作模式PnM1和PnM0组合,00-准双向口,01-推挽输出,10-高阻输入,11-开漏输出
  132.         P0M0 = 0x00;
  133.         P0M1 = 0x00;
  134.         P1M0 = 0x00;
  135.         P1M1 = 0x00;
  136.         P2M0 = 0x00;
  137.         P2M1 = 0x00;
  138.         P3M0 = 0x00;
  139.         P3M1 = 0x00;
  140.         P4M0 = 0x00;
  141.         P4M1 = 0x00;
  142.         P5M0 = 0x00;
  143.         P5M1 = 0x00;
  144. }
  145. void Pin_Switch(void)                // 功能管脚切换
  146. {
  147.         P_SW2 &= 0xFD;                // B1=0 设置串口3的功能脚为P00和P01
  148.         P_SW2 &= ~0x04;                                                //UART4: RxD4(P0.2), TxD4(P0.3)
  149. }
  150. void main()
  151. {
  152.         u16 i,j,n;
  153.         u8 temp[20];
  154.         u8 tt[] = "temp data \r\n";
  155.     GPIO_Init();                // 管脚状态初始化
  156.         Pin_Switch();                // 功能管脚切换
  157.     Uart3_Init();
  158.         Uart4_Init();
  159.     EA = 1;
  160.         i=0;
  161.         j=0;
  162.     while (1)
  163.     {
  164.                 if(i>1000)
  165.                 {
  166.                         i=0;
  167.                         j++;
  168.                         if(j>1000)
  169.                         {
  170.                                 j=0;
  171.                                 P52 = ~P52;
  172.                                 Uart3_SendStr("Uart 3 Test !\r\n");
  173. //                                COM3_PrintString("COM3_PrintString ------ \r\n");
  174.                                 Uart4_SendStr("Uart 4 Test !\r\n");
  175. //                                Uart4_SendStr(tt);  // UART1发送一个字符串       
  176.                         sprintf(temp,"COM4_Rx_Cnt = %d \n",COM4_Rx_Cnt);
  177.                         Uart4_SendStr(temp);  // UART1发送一个字符串       
  178.                                
  179.                         }
  180.                 }
  181.                 i++;
  182.                 if(COM3_Rx_Cnt > 2)
  183.                 {
  184. //                        Uart3_SendStr(COM3_Rx_Buffer);
  185.                         COM3_PrintString(COM3_Rx_Buffer);
  186.                         COM3_Rx_Cnt = 0;
  187.                 }       
  188.                
  189.                 if(COM4_Rx_Cnt > 2)
  190.                 {
  191.                         for(n = 0; n < COM4_Rx_Cnt; n++)
  192.                         {       
  193.                                 Uart4_SendChar(COM4_Rx_Buffer[n]);
  194.                         }
  195. //                        Uart4_SendStr(COM4_Rx_Buffer);
  196. //                        Uart4_SendStr("Uart 4 Get data ---- !\r\n");
  197. ////                        COM4_PrintString(COM4_Rx_Buffer);
  198.                         COM4_Rx_Cnt = 0;
  199.                 }
  200.     }
  201. }       
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:186
  • 最近打卡:2025-03-06 09:49:49

14

主题

133

回帖

1149

积分

金牌会员

积分
1149
发表于 2024-2-29 10:34:49 | 显示全部楼层
本帖最后由 giveyou 于 2024-2-29 10:39 编辑

202-204行,正常发送。接收数据的计数器COM4_Rx_Cnt计数正常。
219-230行,用于返回接收到的数据,返回的数据就是有问题的。
0E05B370-F525-4556-93AE-E3415CA9DD56.png CB39322D-923C-4c6e-AA06-7AB285A32ECE.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2024-2-29 10:48:50 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2024-2-29 10:50:31 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2024-2-29 10:53:43 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2024-2-29 10:56:12 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:186
  • 最近打卡:2025-03-06 09:49:49

14

主题

133

回帖

1149

积分

金牌会员

积分
1149
发表于 2024-2-29 12:19:18 | 显示全部楼层
神*** 发表于 2024-2-29 10:56
深圳国芯人工智能有限公司-工具软件 (stcai.com)

谢谢,我先学习一下,然后找我的错误。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:186
  • 最近打卡:2025-03-06 09:49:49

14

主题

133

回帖

1149

积分

金牌会员

积分
1149
发表于 2024-3-1 08:18:17 | 显示全部楼层
神*** 发表于 2024-2-29 10:48
用我们 官方经典串口程序
程序不做改动的情况下,例05的4个串口的程序都正常,
例04的单独串口4的程序不正常。芯片为STC8H4K64TLR

2295A61D-CF20-498c-84B3-92E9EFF6C757.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2024-3-1 08:24:20 | 显示全部楼层
所以我们程序完善的情况下,芯片正常

另外:
芯片为STC8H4K64TLR====现在没这个命名的
只有 STC8H4K64TL-LQFP48/32, STC8H4K32TL-LQFP48/32
只有 STC8H4K64TLCD-LQFP64/48, STC8H4K32TLCD-LQFP64/48



截图202403010824176406.jpg

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 13:07 , Processed in 0.141928 second(s), 101 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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