花火 2023-11-29 15:22 采纳率: 57.1%
浏览 6

stm32f103c8t6的USART1串口通信 传输中,能传输整型数组,单个的浮点数据可以传输,但是,涉及到带小数点数据的数组就会卡死不动。

我在用simulink做上位机,做在环仿真,使用stm32f103c8t6的USART1串口通信,simulink连上串口与单片机通信,sinmulink计算完成发给单片机,单片机计算完再回传给simulink,这样循环。
问题是: 传输中,能传输整型数组,单个的浮点数据可以传输,但是,涉及到带小数点数据的数组就会卡死不动。
这是单片机收发函数的代码


void Serial_SendByte(double Byte)
{
    USART_SendData(USART1, Byte);        //将字节数据写入数据寄存器,写入后USART自动生成时序波形
    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);    //等待发送完成
    /*下次写入数据寄存器会自动清除发送完成标志位,故此循环后,无需清除标志位*/
}
/**
  * 函    数:串口发送一个数组
  * 参    数:Array 要发送数组的首地址
  * 参    数:Length 要发送数组的长度
  * 返 回 值:无
  */
void Serial_SendArray(double *Array, uint16_t Length)
{
    uint16_t i;
    for (i = 0; i < Length; i ++)        //遍历数组
    {
        Serial_SendByte(Array[i]);        //依次调用Serial_SendByte发送每个字节数据
    }
}
/**
  * 函    数:获取串口接收标志位
  * 参    数:无
  * 返 回 值:串口接收标志位,范围:0~1,接收到数据后,标志位置1,读取后标志位自动清零
  */
uint8_t Serial_GetRxFlag(void)
{
    if (Serial_RxFlag == 1)            //如果标志位为1
    {
        Serial_RxFlag = 0;
        return 1;                    //则返回1,并自动清零标志位
    }
    return 0;                        //如果标志位为0,则返回0
}

double Serial_GetRxData(void)
{
    return Serial_RxData;            //返回接收的数据变量
}

void USART1_IRQHandler(void)
{
    static uint32_t RxState = 0;
    static uint32_t pRxPacket = 0;
    if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
    {
         double RxData = USART_ReceiveData(USART1);    
        if (RxState == 0)
        {
            if (RxData == 1)
            {
                RxState = 1;
                pRxPacket = 0;
            }
        }
        else if (RxState == 1)
        {
            Serial_RxPacket[pRxPacket] = RxData;
            
            pRxPacket ++;
            if (pRxPacket >= 2)
            {
                RxState = 2;
            }
        }
        else if (RxState == 2)
        {

            if (RxData == 2)
            {
                RxState = 0;
                Serial_RxFlag = 1;
            }
        }
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}

这是simulink模块的配置

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-29 18:10
    关注

    【以下回答由 GPT 生成】

    问题描述:

    您好!我是一名资深的IT专家,很高兴能帮您解决问题。根据您的描述,您想要优化使用stm32f103c8t6的USART1串口通信时,当传输带小数点数据的数组时会出现卡死现象的问题。

    解决方案:

    要解决这个问题,可以尝试以下几个步骤:

    步骤 1: 检查串口配置

    首先,请确保您正确配置了串口参数,包括波特率、数据位、校验位和停止位等。这些配置需要与发送和接收设备保持一致。

    例如,您可以使用下面的代码片段来配置USART1:

    #include "stm32f1xx_hal.h"
    
    // 全局变量
    UART_HandleTypeDef huart1;
    
    int main(void)
    {
      // 系统初始化
    
      // 串口初始化
      huart1.Instance = USART1;
      huart1.Init.BaudRate = 115200;
      huart1.Init.WordLength = UART_WORDLENGTH_8B;
      huart1.Init.StopBits = UART_STOPBITS_1;
      huart1.Init.Parity = UART_PARITY_NONE;
      huart1.Init.Mode = UART_MODE_TX_RX;
      huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      huart1.Init.OverSampling = UART_OVERSAMPLING_16;
      if (HAL_UART_Init(&huart1) != HAL_OK)
      {
        // 串口初始化失败处理
      }
    
      // 启动主循环
      while (1)
      {
        // 主循环逻辑
      }
    }
    

    步骤 2: 使用DMA传输

    如果仍然遇到卡死现象,可以尝试使用DMA(Direct Memory Access,直接内存访问)来传输数据。DMA可以实现数据在内存和外设之间的直接传输,减少CPU的负载,提高传输效率。

    例如,您可以使用下面的代码片段配置DMA传输:

    // 在main函数中的合适位置
    #define ARRAY_SIZE 10
    
    uint8_t data_array[ARRAY_SIZE];
    
    // DMA初始化
    if (HAL_UART_Receive_DMA(&huart1, data_array, ARRAY_SIZE) != HAL_OK)
    {
      // DMA初始化失败处理
    }
    
    // DMA接收完成回调函数
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
      if (huart == &huart1)
      {
        // 数据接收完成处理
      }
    }
    
    // 主循环中可以继续处理其他逻辑
    

    步骤 3: 数据协议和错误处理

    检查数据协议是否一致,并添加适当的错误处理机制,以确保及时处理错误情况。

    例如,在接收函数中,您可以添加以下错误处理逻辑:

    // USART1接收完成回调函数
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
      if (huart == &huart1)
      {
        // 数据接收完成处理
    
        if (data_array[0] != 'S' || data_array[ARRAY_SIZE - 1] != 'E')
        {
          // 数据协议错误处理
        }
        else
        {
          // 解析数据逻辑
        }
      }
    }
    

    请按照上述步骤检查和优化您的代码。如果问题依然存在,可能需要进行更详细的调试和分析。希望这些信息能对您有所帮助!

    如果您需要进一步的解决方案,请提供更多的代码和问题细节,我将尽力帮助您解决该问题。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月29日

悬赏问题

  • ¥30 Windows Server 2016利用兩張網卡處理兩個不同網絡
  • ¥15 Python中knn问题
  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源