找回密码
 立即注册
查看: 434|回复: 9

STC8G1K17 串口中断接收数据出错 | 已解决

[复制链接]

该用户从未签到

10

主题

31

回帖

142

积分

注册会员

积分
142
发表于 2023-10-26 11:28:14 | 显示全部楼层 |阅读模式
  7B 00 04 47 47 4B 5A 00 01 61 03 01 01 02 CB 6B    这是中断接收的数据帧打印信息,7B后面本来应该直接跟04,现在多出来个00!!!   注意此数据帧校验正常,发送数据也正常,只在接收时出现此问题。



  接收程序代码如下:

/**
* @brief  中断服务函数
* @param  无
* @retval 无
*/
void UART2_ISR_Handler (void) interrupt UART2_VECTOR
{
        if(RI2)
        {
                CLR_RI2();
                if(Busy_UartRxd == 0)
                {
                        ZYLoRa_buff[ZYLoRa_p++] = S2BUF;
                        Timer_Multiple_timings(USART2_RxTimeOut_NO,5);               
                }
                else
                {
                        /* 清除缓存标志 */
                        memset(ZYLoRa_buff,0,ZYLoRa_p);
                        ZYLoRa_SendStr_length(ZYLoRa_buff,ZYLoRa_p); //返回接收信息
                        ZYLoRa_p = 0;                        
                }
        }

        if(TI2)
        {
                CLR_TI2();
                Busy_uartii = 0; //
        }
}

回复 送花

使用道具 举报

该用户从未签到

551

主题

9428

回帖

1万

积分

管理员

积分
14003
发表于 2023-10-26 13:52:19 | 显示全部楼层
回复 支持 反对 送花

使用道具 举报

该用户从未签到

10

主题

31

回帖

142

积分

注册会员

积分
142
 楼主| 发表于 2023-10-26 14:11:26 | 显示全部楼层
我这样写不对?
回复 支持 反对 送花

使用道具 举报

该用户从未签到

10

主题

31

回帖

142

积分

注册会员

积分
142
 楼主| 发表于 2023-10-26 14:13:18 | 显示全部楼层
//========================================================================
// 函数: void UART2_int (void) interrupt UART2_VECTOR
// 描述: 串口2中断函数
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-2
// 备注:
//========================================================================
void UART2_int (void) interrupt UART2_VECTOR
{
        if(RI2)
        {
                CLR_RI2();
                RX2_Buffer[RX2_write] = S2BUF;
                if(++RX2_write >= RX2_Length)        RX2_write = 0;
        }

        if(TI2)
        {
                CLR_TI2();
                B_TX2_Busy = 0;
        }

}
回复 支持 反对 送花

使用道具 举报

该用户从未签到

10

主题

31

回帖

142

积分

注册会员

积分
142
 楼主| 发表于 2023-10-26 14:14:24 | 显示全部楼层
你们程序这样写的,我不明白哪里错了。
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    郁闷
    2024-3-30 20:16
  • 签到天数: 2 天

    [LV.1]初来乍到

    3

    主题

    9

    回帖

    83

    积分

    注册会员

    积分
    83
    发表于 2023-10-30 22:06:32 | 显示全部楼层
    神农鼎 发表于 2023-10-26 13:52
    【新提醒】求STC8系列4个串口同时通信的程序,Modbus 演示程序 - 串行口,DMA支持的4组串口,RS232,RS48 ...

    鼎,想问一下STC32G官方库函数里面的UART部分,里面的
    1. #define        PRINTF_SELECT  UART1                //选择 printf 函数所使用的串口,参数 UART1~UART4
    复制代码

    这个函数,可不可以同时使用多个串口使用printf?
    比如同时让多个串口在一个程序里面使用库里面定义的printf这样的。
    如果可以的话,应该怎么修改啊?可不可以给个例子或修改说明呢?
    谢谢~
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    9 小时前
  • 签到天数: 140 天

    [LV.7]常住居民III

    26

    主题

    1335

    回帖

    4155

    积分

    论坛元老

    积分
    4155
    发表于 2023-10-31 10:24:03 | 显示全部楼层
    本帖最后由 乘风飞扬 于 2023-10-31 15:35 编辑
    9DHans 发表于 2023-10-30 22:06
    鼎,想问一下STC32G官方库函数里面的UART部分,里面的

    这个函数,可不可以同时使用多个串口使用printf? ...

    STC32G库函数 "STC32G_UART.c" 文件末尾是重写 putchar 函数将 printf 映射到指定串口的方法:
    1. #if(PRINTF_SELECT == 1)
    2. char putchar(char c)
    3. {
    4.         TX1_write2buff(c);
    5.         return c;
    6. }
    7. #elif(PRINTF_SELECT == 2)
    8. char putchar(char c)
    9. {
    10.         TX2_write2buff(c);
    11.         return c;
    12. }
    13. #elif(PRINTF_SELECT == 3)
    14. char putchar(char c)
    15. {
    16.         TX3_write2buff(c);
    17.         return c;
    18. }
    19. #elif(PRINTF_SELECT == 4)
    20. char putchar(char c)
    21. {
    22.         TX4_write2buff(c);
    23.         return c;
    24. }
    25. #endif
    复制代码
    如果想多串口使用 printf 就需要进行重新封装了,例如通过一个全局变量来判断当前使用哪个串口打印。
    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    9 小时前
  • 签到天数: 140 天

    [LV.7]常住居民III

    26

    主题

    1335

    回帖

    4155

    积分

    论坛元老

    积分
    4155
    发表于 2023-10-31 15:36:20 | 显示全部楼层
    9DHans 发表于 2023-10-30 22:06
    鼎,想问一下STC32G官方库函数里面的UART部分,里面的

    这个函数,可不可以同时使用多个串口使用printf? ...

    附件提供一种多串口使用 printf 方式重新封装打印函数的例子,请参考
    1. void UART1_printf(char *fmt,...)
    2. {
    3.     u32 i,length;
    4.     va_list ap;
    5.     va_start(ap,fmt);
    6.     vsprintf(usart_txBuff,fmt,ap);
    7.     va_end(ap);
    8.     length=strlen((const char*)usart_txBuff);
    9.     for(i=0;i<length;i++)
    10.     {
    11.         SBUF  = usart_txBuff[i];
    12.         while(TI == 0);
    13.         TI = 0;    //Clear Tx flag
    14.     }
    15. }
    复制代码

    多串口使用printf函数进行打印-STC32G.zip

    16.92 KB, 下载次数: 22

    点评

    建议另外单独发个贴,大家好方便查到  发表于 2023-10-31 16:13
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    郁闷
    2024-3-30 20:16
  • 签到天数: 2 天

    [LV.1]初来乍到

    3

    主题

    9

    回帖

    83

    积分

    注册会员

    积分
    83
    发表于 2023-11-1 10:07:01 | 显示全部楼层
    乘风飞扬 发表于 2023-10-31 15:36
    附件提供一种多串口使用 printf 方式重新封装打印函数的例子,请参考

    非常感谢老师的指导
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-14 18:02 , Processed in 0.077469 second(s), 67 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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