找回密码
 立即注册
查看: 1150|回复: 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; //
        }
}

回复

使用道具 举报 送花

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

718

主题

1万

回帖

1万

积分

管理员

积分
15630
发表于 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 | 显示全部楼层
你们程序这样写的,我不明白哪里错了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-12-26 09:36:03
已绑定手机

3

主题

9

回帖

87

积分

注册会员

积分
87
发表于 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这样的。
如果可以的话,应该怎么修改啊?可不可以给个例子或修改说明呢?
谢谢~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2023-10-31 10:24:03 | 显示全部楼层
本帖最后由 乘风飞扬 于 2023-10-31 15:35 编辑
9DH*** 发表于 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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2023-10-31 15:36:20 | 显示全部楼层
9DH*** 发表于 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, 下载次数: 115

点评

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-12-26 09:36:03
已绑定手机

3

主题

9

回帖

87

积分

注册会员

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 20:43 , Processed in 0.159939 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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