Zhouzhou 发表于 2023-10-26 11:28:14

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

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 = 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; //
      }
}

神农鼎 发表于 2023-10-26 13:52:19



【新提醒】求STC8系列4个串口同时通信的程序,Modbus 演示程序 - 串行口,DMA支持的4组串口,RS232,RS485 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

Zhouzhou 发表于 2023-10-26 14:11:26

我这样写不对?

Zhouzhou 发表于 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 = S2BUF;
                if(++RX2_write >= RX2_Length)        RX2_write = 0;
        }

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

}

Zhouzhou 发表于 2023-10-26 14:14:24

你们程序这样写的,我不明白哪里错了。

9DHans 发表于 2023-10-30 22:06:32

神农鼎 发表于 2023-10-26 13:52
【新提醒】求STC8系列4个串口同时通信的程序,Modbus 演示程序 - 串行口,DMA支持的4组串口,RS232,RS48 ...

鼎,想问一下STC32G官方库函数里面的UART部分,里面的
#define        PRINTF_SELECTUART1                //选择 printf 函数所使用的串口,参数 UART1~UART4
这个函数,可不可以同时使用多个串口使用printf?
比如同时让多个串口在一个程序里面使用库里面定义的printf这样的。
如果可以的话,应该怎么修改啊?可不可以给个例子或修改说明呢?
谢谢~

乘风飞扬 发表于 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 映射到指定串口的方法:
#if(PRINTF_SELECT == 1)

char putchar(char c)
{
      TX1_write2buff(c);
      return c;
}

#elif(PRINTF_SELECT == 2)

char putchar(char c)
{
      TX2_write2buff(c);
      return c;
}

#elif(PRINTF_SELECT == 3)

char putchar(char c)
{
      TX3_write2buff(c);
      return c;
}

#elif(PRINTF_SELECT == 4)

char putchar(char c)
{
      TX4_write2buff(c);
      return c;
}

#endif
如果想多串口使用 printf 就需要进行重新封装了,例如通过一个全局变量来判断当前使用哪个串口打印。

乘风飞扬 发表于 2023-10-31 15:36:20

9DHans 发表于 2023-10-30 22:06
鼎,想问一下STC32G官方库函数里面的UART部分,里面的

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

附件提供一种多串口使用 printf 方式重新封装打印函数的例子,请参考
void UART1_printf(char *fmt,...)
{
    u32 i,length;
    va_list ap;
    va_start(ap,fmt);
    vsprintf(usart_txBuff,fmt,ap);
    va_end(ap);
    length=strlen((const char*)usart_txBuff);

    for(i=0;i<length;i++)
    {
      SBUF= usart_txBuff;
      while(TI == 0);
      TI = 0;    //Clear Tx flag
    }
}

9DHans 发表于 2023-11-1 10:07:01

乘风飞扬 发表于 2023-10-31 15:36
附件提供一种多串口使用 printf 方式重新封装打印函数的例子,请参考

非常感谢老师的指导
页: [1]
查看完整版本: STC8G1K17 串口中断接收数据出错 | 已解决