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

遇到串口4奇怪的问题

[复制链接]
  • TA的每日心情
    开心
    2024-3-20 08:31
  • 签到天数: 57 天

    [LV.5]常住居民I

    5

    主题

    23

    回帖

    303

    积分

    中级会员

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

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





    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-20 08:31
  • 签到天数: 57 天

    [LV.5]常住居民I

    5

    主题

    23

    回帖

    303

    积分

    中级会员

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


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-20 08:31
  • 签到天数: 57 天

    [LV.5]常住居民I

    5

    主题

    23

    回帖

    303

    积分

    中级会员

    积分
    303
     楼主| 发表于 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

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9234

    回帖

    1万

    积分

    管理员

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

    使用道具 举报

    该用户从未签到

    550

    主题

    9234

    回帖

    1万

    积分

    管理员

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

    使用道具 举报

    该用户从未签到

    550

    主题

    9234

    回帖

    1万

    积分

    管理员

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

    使用道具 举报

    该用户从未签到

    550

    主题

    9234

    回帖

    1万

    积分

    管理员

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-20 08:31
  • 签到天数: 57 天

    [LV.5]常住居民I

    5

    主题

    23

    回帖

    303

    积分

    中级会员

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

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-20 08:31
  • 签到天数: 57 天

    [LV.5]常住居民I

    5

    主题

    23

    回帖

    303

    积分

    中级会员

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

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

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9234

    回帖

    1万

    积分

    管理员

    积分
    13942
    发表于 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, 2024-4-29 03:27 , Processed in 0.071004 second(s), 67 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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