[单片机芯片] CH32F103 USART1连接接收查询指令后,会中断数据发送

[复制链接]
5352|9
 楼主| sunicecream 发表于 2021-10-21 16:13 | 显示全部楼层 |阅读模式
采用CH32F103C8T6做下位机,上位机用SSCOM连续向下位机发送查询指令,下位机上传几次数据后就不再上传数据了,只在USART1有此问题,USART2没有这个问题,同样的架构的程序移植到CH32VF103也正常没有出现这个情况,这个是硬件本身的问题吗,可有解决办法,程序随附件

  1. /*******************************************************************************
  2. * [url=home.php?mod=space&uid=288409]@file[/url]    cmd_usart.c
  3. * [url=home.php?mod=space&uid=187600]@author[/url]  MR.Hu
  4. * [url=home.php?mod=space&uid=895143]@version[/url] 0.0.1
  5. * [url=home.php?mod=space&uid=212281]@date[/url]    2021-07-18
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]   命令串口使用
  7. *********************************************************************************************/

  8. /*--------包含的头文件--------------------------------------------------------------------------*/
  9. #include <string.h>
  10. #include "cmd_usart.h"          
  11. #include "global_variables.h"
  12. #include "CRC8_16.h"

  13. /*--------中断声明-----------------------------------------------------------------------------*/

  14. void USART1_IRQHandler(void)        __attribute__((interrupt("WCH-Interrupt-fast")));
  15. void USART2_IRQHandler(void)        __attribute__((interrupt("WCH-Interrupt-fast")));

  16. /*--------全局变量-----------------------------------------------------------------------------*/


  17. /**********************************************************************************************
  18.         * 函数名                : uart_init()
  19.         * 形参变量        :bound-------波特率
  20.         * 返回值                :无
  21.         *        函数功能        :串口1初始化
  22. *********************************************************************************************/
  23. void cmd_uart_init(uint32_t   CMD_USART_Baudrate)
  24.         {
  25.        //-------GPIO端口设置--------------------------------------------------
  26.       GPIO_InitTypeDef                 GPIO_InitStructure;
  27.           USART_InitTypeDef         USART_InitStructure;
  28.           NVIC_InitTypeDef                 NVIC_InitStructure;


  29.           USART_DeInit(USART1);  //复位串口1
  30.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
  31.           //------USART1_TX   PA.9-------------------------------------------------------------------------------
  32.           GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_9;                   //  PA.9
  33.           GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
  34.           GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_AF_PP;              //  复用推挽输出
  35.           GPIO_Init(GPIOA, &GPIO_InitStructure);                          //  初始化PA9

  36.           //------USART1_RX     PA.10------------------------------------------------------------------------------
  37.           GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_10;                  //  初始化PA10
  38.           GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_IN_FLOATING;        //  浮空输入
  39.           GPIO_Init(GPIOA, &GPIO_InitStructure);

  40.                 // 485收发控制管脚
  41.           RCC_APB2PeriphClockCmd(RS485_RE_GPIO_CLK,ENABLE); //开启按键端口的时钟
  42.           GPIO_InitStructure.GPIO_Pin         = RS485_RE_PIN;
  43.           GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_Out_PP;
  44.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  45.           GPIO_Init(RS485_RE_GPIO_PORT, &GPIO_InitStructure);

  46.           GPIO_ResetBits(RS485_RE_GPIO_PORT,RS485_RE_PIN);                                         //        控制485芯片进入接收模式

  47.                 //------Usart1 NVIC 配置-------------------------------------------------------------------------------
  48.           USART_InitStructure.USART_BaudRate              = CMD_USART_Baudrate;                     //  设置波特率
  49.           USART_InitStructure.USART_WordLength            = USART_WordLength_8b;              //  设置字长
  50.           USART_InitStructure.USART_StopBits              = USART_StopBits_1;                 //  1位停止位
  51.           USART_InitStructure.USART_Parity                = USART_Parity_No;                  //  没有校验位
  52.           USART_InitStructure.USART_HardwareFlowControl   = USART_HardwareFlowControl_None;   //  无硬件流控制
  53.           USART_InitStructure.USART_Mode                  = USART_Mode_Tx | USART_Mode_Rx;    //  双工模式


  54.           USART_Init(USART1, &USART_InitStructure);

  55.           // 空闲中断设置
  56.           NVIC_InitStructure.NVIC_IRQChannel                      = USART1_IRQn;
  57.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority    = 1;                          //  抢占优先级为1
  58.           NVIC_InitStructure.NVIC_IRQChannelSubPriority           = 1;                          //  子优先级为1
  59.           NVIC_InitStructure.NVIC_IRQChannelCmd                   = ENABLE;                     //  IRQ通道使能
  60.           NVIC_Init(&NVIC_InitStructure);                                                       //  中断优先级初始化

  61.           //    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);    //  接收中断使能
  62.           USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);          //  串口空闲中断使能
  63.           USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
  64.           USART_Cmd(USART1,ENABLE);
  65. }


  66. /**********************************************************************************************
  67.     * 函数名       : uart_init()
  68.     * 形参变量  :bound-------波特率
  69.     * 返回值       :无
  70.     * 函数功能    :串口1初始化
  71. *********************************************************************************************/
  72. void device_usart_init(uint32_t   DEVICE_USART_Baudrate)
  73.     {
  74.        //-------GPIO端口设置--------------------------------------------------
  75.       GPIO_InitTypeDef      GPIO_InitStructure;
  76.       USART_InitTypeDef     USART_InitStructure;
  77.       NVIC_InitTypeDef      NVIC_InitStructure;


  78.       USART_DeInit(USART2);  //复位串口1
  79.       RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  80.       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  81.       //------USART2_TX   PA.2-------------------------------------------------------------------------------
  82.       GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_2;                   //  PA.9
  83.       GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
  84.       GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_AF_PP;              //  复用推挽输出
  85.       GPIO_Init(GPIOA, &GPIO_InitStructure);                          //  初始化PA9

  86.       //------USART1_RX     PA.3------------------------------------------------------------------------------
  87.       GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_3;                  //  初始化PA10
  88.       GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_IN_FLOATING;       //  浮空输入
  89.       GPIO_Init(GPIOA, &GPIO_InitStructure);


  90.         //------Usart1 NVIC 配置-------------------------------------------------------------------------------
  91.       USART_InitStructure.USART_BaudRate              = DEVICE_USART_Baudrate;            //  设置波特率
  92.       USART_InitStructure.USART_WordLength            = USART_WordLength_8b;              //  设置字长
  93.       USART_InitStructure.USART_StopBits              = USART_StopBits_1;                 //  1位停止位
  94.       USART_InitStructure.USART_Parity                = USART_Parity_No;                  //  没有校验位
  95.       USART_InitStructure.USART_HardwareFlowControl   = USART_HardwareFlowControl_None;   //  无硬件流控制
  96.       USART_InitStructure.USART_Mode                  = USART_Mode_Tx | USART_Mode_Rx;    //  双工模式


  97.       USART_Init(USART2, &USART_InitStructure);

  98.       // 空闲中断设置
  99.       NVIC_InitStructure.NVIC_IRQChannel                      = USART2_IRQn;
  100.       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority    = 1;                          //  抢占优先级为1
  101.       NVIC_InitStructure.NVIC_IRQChannelSubPriority           = 1;                          //  子优先级为1
  102.       NVIC_InitStructure.NVIC_IRQChannelCmd                   = ENABLE;                     //  IRQ通道使能
  103.       NVIC_Init(&NVIC_InitStructure);                                                       //  中断优先级初始化

  104.       //    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);    //  接收中断使能
  105.       USART_ITConfig(USART2,USART_IT_IDLE,ENABLE);          //  串口空闲中断使能
  106.       USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);
  107.       USART_Cmd(USART2,ENABLE);
  108. }



  109. /*******************************************************************************
  110. * Function Name  : DMA1_CH5_Init
  111. * Description    : Initializes Channel3 of DMA1 collection.  DMA1通道5传输参数配置
  112. * Input          : None
  113. * Return         : None
  114. *******************************************************************************/
  115. void DMA1_CH5_USART1_RX_Init(void)
  116. {
  117.   DMA_InitTypeDef   DMA_InitStructure;

  118.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);                        //  使能DMA1时钟

  119.   DMA_InitStructure.DMA_PeripheralBaseAddr  = (u32)(&USART1->DATAR);        //  设置源数据地址
  120.   DMA_InitStructure.DMA_MemoryBaseAddr      = (u32) CMD_RX_Buffer;          //  设置目标地址
  121.   DMA_InitStructure.DMA_DIR                 = DMA_DIR_PeripheralSRC;        //  设置传输方向:外设到存储器(此处外设为内部FLASH)
  122.   DMA_InitStructure.DMA_BufferSize          = CMD_RX_Buf_Len;               //  设置传输大小
  123.   DMA_InitStructure.DMA_PeripheralInc       = DMA_PeripheralInc_Disable;    //  指定外设地址寄存器不变。
  124.   DMA_InitStructure.DMA_MemoryInc           = DMA_MemoryInc_Enable;         //  指定内存地址寄存器递增。
  125.   DMA_InitStructure.DMA_PeripheralDataSize  = DMA_PeripheralDataSize_Byte;  //  设置外设数据单位
  126.   DMA_InitStructure.DMA_MemoryDataSize      = DMA_PeripheralDataSize_Byte;  //  设置存储器数据单位
  127.   DMA_InitStructure.DMA_Mode                = DMA_Mode_Normal;              //  设置对应DMA工作模式为正常模式
  128.   DMA_InitStructure.DMA_Priority            = DMA_Priority_VeryHigh;        //  DMA1通道5优先级高
  129.   DMA_InitStructure.DMA_M2M                 = DMA_M2M_Disable;              //  使能DMA存储器到存储器的传输方式
  130.   DMA_Init(DMA1_Channel5, &DMA_InitStructure);                              //  根据DMA_InitStruct中指定的参数初始化DMA1通道3

  131.   DMA_Cmd(DMA1_Channel5, ENABLE);                                           //  使能DMA1通道5
  132. }


  133. /*******************************************************************************
  134. * Function Name  : DMA1_CH5_Init
  135. * Description    : Initializes Channel3 of DMA1 collection.  DMA1通道5传输参数配置
  136. * Input          : None
  137. * Return         : None
  138. *******************************************************************************/
  139. void DMA1_CH6_USART2_RX_Init(void)
  140. {
  141.   DMA_InitTypeDef   DMA_InitStructure;

  142.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);                        //  使能DMA1时钟

  143.   DMA_InitStructure.DMA_PeripheralBaseAddr  = (u32)(&USART2->DATAR);        //  设置源数据地址
  144.   DMA_InitStructure.DMA_MemoryBaseAddr      = (u32) DEVICE_RX_Buffer;       //  设置目标地址
  145.   DMA_InitStructure.DMA_DIR                 = DMA_DIR_PeripheralSRC;        //  设置传输方向:外设到存储器(此处外设为内部FLASH)
  146.   DMA_InitStructure.DMA_BufferSize          = CMD_RX_Buf_Len;               //  设置传输大小
  147.   DMA_InitStructure.DMA_PeripheralInc       = DMA_PeripheralInc_Disable;    //  指定外设地址寄存器不变。
  148.   DMA_InitStructure.DMA_MemoryInc           = DMA_MemoryInc_Enable;         //  指定内存地址寄存器递增。
  149.   DMA_InitStructure.DMA_PeripheralDataSize  = DMA_PeripheralDataSize_Byte;  //  设置外设数据单位
  150.   DMA_InitStructure.DMA_MemoryDataSize      = DMA_PeripheralDataSize_Byte;  //  设置存储器数据单位
  151.   DMA_InitStructure.DMA_Mode                = DMA_Mode_Normal;              //  设置对应DMA工作模式为正常模式
  152.   DMA_InitStructure.DMA_Priority            = DMA_Priority_VeryHigh;        //  DMA1通道5优先级高
  153.   DMA_InitStructure.DMA_M2M                 = DMA_M2M_Disable;              //  使能DMA存储器到存储器的传输方式
  154.   DMA_Init(DMA1_Channel6, &DMA_InitStructure);                              //  根据DMA_InitStruct中指定的参数初始化DMA1通道3

  155.   DMA_Cmd(DMA1_Channel6, ENABLE);                                           //  使能DMA1通道6
  156. }


  157. void DMA1_Init(void)
  158. {
  159.     DMA1_CH5_USART1_RX_Init();
  160.     DMA1_CH6_USART2_RX_Init();
  161. }
  162. /**********************************************************************************************
  163.     * 函数名      :Usart1_Send()
  164.     * 形参变量  :无
  165.     * 返回值      :无
  166.     * 函数功能  :串口1发送程序
  167. *********************************************************************************************/
  168. void Usart1_Send(uint8_t *buf,  uint16_t len)
  169. {
  170.     uint16_t t;
  171.     RS485_TX_EN();
  172.           for(t=0;t<len;t++)                //        循环发送数据
  173.           {
  174.                 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);        //  TXE 弹夹为空
  175.                 USART_SendData(USART1,buf[t]);
  176.           }

  177.         while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);             //  TC,弹夹为空,枪膛也为空
  178.           RS485_RX_EN();
  179. }


  180. /*******************************************************************************
  181.     * 函数名      :Usart2_Send()
  182.     * 形参变量  :无
  183.     * 返回值      :无
  184.     * 函数功能  :串口2发送程序
  185. *******************************************************************************/
  186. void Usart2_Send(uint8_t *buf,  uint16_t len)
  187. {
  188.     uint16_t t;

  189.     for(t=0;t<len;t++)      //  循环发送数据
  190.       {
  191.         while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
  192.         USART_SendData(USART2,buf[t]);
  193.       }

  194.     while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
  195. }

  196. /**********************************************************************************************
  197.     * 函数名       :USARTx_SendByte()
  198.     * 形参变量   :pUSARTx,可以是USART1、USART2、USART3
  199.     *          data,要发送的字节
  200.     * 返回值       :无
  201.     *函数功能      :串口发送字符串
  202. *********************************************************************************************/
  203. void USARTx_SendByte(USART_TypeDef* pUSARTx, uint8_t data)
  204. {
  205.     while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
  206.     USART_SendData(pUSARTx, data);
  207.     while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
  208. }
  209. /**********************************************************************************************
  210.     * 函数名       :USARTx_SendStr()
  211.     * 形参变量   :pUSARTx:  可以是USART1、USART2、USART3
  212.     *         *str   :  字符串
  213.     * 返回值       :无
  214.     *函数功能      :串口发送字符串
  215. *********************************************************************************************/
  216. void USARTx_SendStr(USART_TypeDef* pUSARTx, char *str)
  217. {
  218.   uint8_t      i = 0;

  219.   RS485_TX_EN();
  220.   do
  221.     {
  222.        USARTx_SendByte(pUSARTx, *(str+i));
  223.        i++;
  224.     }while(*(str+i) != '\0');

  225.   while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET);
  226.   RS485_RX_EN();
  227. }


  228. void USART2_SendStr(char *str)
  229. {
  230.   uint8_t      i = 0;

  231.   do
  232.     {
  233.        USARTx_SendByte(USART2, *(str+i));
  234.        i++;
  235.     }while(*(str+i) != '\0');

  236.   while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
  237. }

  238. /**********************************************************************************************
  239.         * 函数名         :USART1_IRQHandler()
  240.         * 形参变量            :无
  241.         * 返回值            :无
  242.         *函数功能            :串口1中断服务程序
  243. *********************************************************************************************/
  244. void USART1_IRQHandler(void)
  245.         {
  246.           if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
  247.                 {
  248.               DMA_Cmd(DMA1_Channel5,DISABLE);                                                   //  关闭DMA传输
  249.               CMD_USART_Rec_Cnt =  CMD_RX_Buf_Len - DMA_GetCurrDataCounter(DMA1_Channel5);      //  获取串口接收的数据数量

  250.               Receive_one_fame_OK = 1;      //  1帧数据完成接收
  251.               //-----------------------------------------------------------------------------------------------------------------------------------------//
  252.               // USART1->STATR;        //  读状态寄存器
  253.               // USART1->DATAR;        //  再读数据寄存器,此操作用于清除空闲中断标志位


  254.               DMA_SetCurrDataCounter(DMA1_Channel5,CMD_RX_Buf_Len);     //  重新设置传输的数据数量
  255.               DMA_Cmd(DMA1_Channel5,ENABLE);                            //  开启DMA传输

  256.               USART_ReceiveData(USART1);                                //  读取一次数据,不然会一直进中断
  257.               USART_ClearFlag(USART1,USART_FLAG_IDLE);                  //  清除串口空闲中断标志位
  258.                 }
  259. }


  260. /**********************************************************************************************
  261.     * 函数名         :USART1_IRQHandler()
  262.     * 形参变量      :无
  263.     * 返回值       :无
  264.     *函数功能       :串口1中断服务程序
  265. *********************************************************************************************/
  266. void USART2_IRQHandler(void)
  267.     {
  268.         uint16_t CRC_calchkval;

  269.       if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)
  270.         {
  271.           DMA_Cmd(DMA1_Channel6,DISABLE);                                                   //  关闭DMA传输
  272.           DEVICE_USART_Rec_Cnt =  CMD_RX_Buf_Len - DMA_GetCurrDataCounter(DMA1_Channel6);   //  获取串口接收的数据数量

  273.           DEVICE_USART_Receive_complete = 1;      //  1帧数据完成接收
  274.           //--------------------------------------------------------------------------------//
  275.           CMD_TX_Buffer[0]   =HEAD_FRAME_HI;                                                //  帧头高位
  276.           CMD_TX_Buffer[1]   =HEAD_FRAME_LO;                                                //  帧头低位
  277.           CMD_TX_Buffer[2]   =BOARD_ADDRESS;                                                //  电路模块地址
  278.           CMD_TX_Buffer[3]  = functional_unit;                                              //  功能单元,同一地址的电路模块中的某个器件,00表示回复数据为版本号
  279.           CMD_TX_Buffer[4]  = functional_code;                                              //  功能码
  280.           CMD_TX_Buffer[5]   =((uint8_t)((DEVICE_USART_Rec_Cnt & 0xFF00)>>8));              //  数据长度
  281.           CMD_TX_Buffer[6]   =((uint8_t)( DEVICE_USART_Rec_Cnt & 0x00FF));                  //  数据长度

  282.           memcpy(CMD_TX_Buffer+7,DEVICE_RX_Buffer,DEVICE_USART_Rec_Cnt);                    //  数据保存在第二个缓冲区
  283.           CRC_calchkval = MODBUS_CRC16(CMD_TX_Buffer, 7+DEVICE_USART_Rec_Cnt);
  284.           CMD_TX_Buffer[7+DEVICE_USART_Rec_Cnt] = ((uint8_t)(( CRC_calchkval & 0xFF00)>>8));//  校验码保存到待发送的缓存里
  285.           CMD_TX_Buffer[8+DEVICE_USART_Rec_Cnt] = ((uint8_t)(  CRC_calchkval & 0x00FF)    );
  286.           Usart1_Send(CMD_TX_Buffer,9+DEVICE_USART_Rec_Cnt);

  287.           DMA_SetCurrDataCounter(DMA1_Channel6,CMD_RX_Buf_Len);     //  重新设置传输的数据数量
  288.           DMA_Cmd(DMA1_Channel6,ENABLE);                            //  开启DMA传输

  289.           USART_ReceiveData(USART2);                                //  读取一次数据,不然会一直进中断
  290.           USART_ClearFlag(USART2,USART_FLAG_IDLE);                  //  清除串口空闲中断标志位
  291.         }
  292. }
















CH32F103C8T6_debug.rar

532.87 KB, 下载次数: 4

LIzs6 发表于 2021-10-21 16:45 | 显示全部楼层
看了一下,怀疑问题可能是没有清除空闲中断标志位导致的,空闲中断标志位的清除方法应该先读状态寄存器,再读数据寄存器,然而这一段被你注释掉了
 楼主| sunicecream 发表于 2021-10-21 17:36 | 显示全部楼层
LIzs6 发表于 2021-10-21 16:45
看了一下,怀疑问题可能是没有清除空闲中断标志位导致的,空闲中断标志位的清除方法应该先读状态寄存器,再 ...

之胶尝试过加上的,发现没用,就注释掉了,刚重新试了一下,确实不行。上位机间隔50ms发送查询,返回几次结果之后就停掉了
RISCVLAR 发表于 2021-10-21 20:07 | 显示全部楼层
sunicecream 发表于 2021-10-21 17:36
之胶尝试过加上的,发现没用,就注释掉了,刚重新试了一下,确实不行。上位机间隔50ms发送查询,返回几次 ...

是类似于下面截图那种通过串口1发送指令,单片机根据指令通过串口1返回相关信息么?是通过串口1空闲中断进行数据收发处理么? Snipaste_2021-10-21_20-04-38.jpg
 楼主| sunicecream 发表于 2021-10-21 20:45 | 显示全部楼层
RISCVLAR 发表于 2021-10-21 20:07
是类似于下面截图那种通过串口1发送指令,单片机根据指令通过串口1返回相关信息么?是通过串口1空闲中断 ...

我是用空闲中断+DMA接收不定长的数据帧,空闲中断接收完一帧数据后,在空闲中断内置位一个接收帧完成标志位和恢复DMA接收的操作就出中断了,帧命令解析都是在主函数内完成的。比如我发送个命令A5 5A 30 00 02 00 00 来查询硬件的版本信息,下位机解析完命令后就回类似的命令。现在的问题是我用定时发送,间隔50ms,下位机返回几次信息后,就不再返回了。同样的程序,在STM32上运行,是没有任何问题的,RISV的CH32V103上边运行也没有问题。
zchong 发表于 2021-10-22 07:38 来自手机 | 显示全部楼层
这种情况就头痛医头,脚痛医脚就行了,调试看看是哪个标志出问题了呗
LIzs6 发表于 2021-10-22 10:23 | 显示全部楼层
sunicecream 发表于 2021-10-21 17:36
之胶尝试过加上的,发现没用,就注释掉了,刚重新试了一下,确实不行。上位机间隔50ms发送查询,返回几次 ...

这边有个串口空闲中断DMA例程,对比看一下吧

串口空闲中断-DMA.zip

593.46 KB, 下载次数: 3

cainiao518 发表于 2021-10-22 10:37 | 显示全部楼层
不用DMA试试?
ayb_ice 发表于 2021-10-22 13:16 | 显示全部楼层
肯定程序问题,把上位机发送的间隔搞大些再测试
 楼主| sunicecream 发表于 2021-10-22 13:45 | 显示全部楼层
本帖最后由 sunicecream 于 2021-10-22 13:51 编辑

找到原因了,是硬件问题,出于兼容性的原因,跟别的串口有连接,断开与该芯片连接后,问题没有出现。只是同样的连接,用STM32F103和CH32V103是没有这样的问题的。估计是芯片内部某种原因。程序是没有问题的。这里感谢大家的回复!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

97

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部