[STM32F1] stm32f103c8t6串口发送大量hex数据失效。

[复制链接]
2026|26
 楼主| 两只袜子 发表于 2024-5-6 16:00 | 显示全部楼层 |阅读模式

我发送数据量为640个十六进制数据是正常的,上位机有收到书籍。但是我想发送3600个数据就一直灭有反应,不知道为啥什么,求助。我使用的是A9,A10的usart接口。以下是部分代码
#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>


void Serial_Init(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
      
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
      
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
      
        USART_InitTypeDef USART_InitStructure;
        USART_InitStructure.USART_BaudRate = 9600;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_Init(USART1, &USART_InitStructure);
      
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
      
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
      
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_Init(&NVIC_InitStructure);
      
        USART_Cmd(USART1, ENABLE);
}

void Serial_SendByte(uint8_t Byte)
{
        USART_SendData(USART1, Byte);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
        uint16_t i;
        for (i = 0; i < Length; i ++)
        {
                Serial_SendByte(Array);
        }
}


然后我定义了一个数组arra[3600],用 Serial_SendArray函数发送后没有反应
光辉梦境 发表于 2024-5-14 14:23 | 显示全部楼层
你可以把大数据分包发啊,这样不就OK了么
一秒落纱 发表于 2024-5-14 16:00 | 显示全部楼层
这个我没遇到过,但是听你描述你的串口通讯应该没问题,建议抓一下波形,看看怎么回事儿
淡漠安然 发表于 2024-5-14 17:00 | 显示全部楼层
为啥发送3600个数据一个都收不到?
暖了夏天蓝了海 发表于 2024-5-14 19:00 | 显示全部楼层
你可以用串口模块抓一下数据的,看看是否数据发送正常啊
三生万物 发表于 2024-5-14 21:00 | 显示全部楼层
你仿真看看呗,看程序怎么执行的
远山寻你 发表于 2024-5-14 23:00 | 显示全部楼层
是不是程序都没运行成功的啊?
江河千里 发表于 2024-5-15 02:00 | 显示全部楼层
感觉是你缓冲区编译设计过大了吧?
别乱了阵脚 发表于 2024-5-15 04:00 | 显示全部楼层
改一下堆栈试试?不过我觉得才3600个数据应该无所谓吧,不需要这样
冰春彩落下 发表于 2024-5-15 10:00 | 显示全部楼层
你可以用逻辑分析仪抓一下波形,看看串口
夜阑风雨 发表于 2024-5-15 14:00 | 显示全部楼层
有可能是你的3600个数据之中有违规的数据吧,把程序搞死掉了
一秒落纱 发表于 2024-5-15 16:00 | 显示全部楼层
这个我没遇到过,但是听你描述你的串口通讯应该没问题,建议抓一下波形,看看怎么回事儿
家有两宝呀 发表于 2024-7-31 23:59 | 显示全部楼层
Serial_SendArray函数的错误
在Serial_SendArray函数中,你有一个小错误。Serial_SendByte函数接受一个字节,但你在循环中传递了一个数组指针而不是单个字节。
家有两宝呀 发表于 2024-7-31 23:59 | 显示全部楼层
修正后的代码如下

void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
    uint16_t i;
    for (i = 0; i < Length; i++)
    {
        Serial_SendByte(Array[i]); // 修正这里,传递单个字节
    }
}

家有两宝呀 发表于 2024-7-31 23:59 | 显示全部楼层
数据发送速度和缓冲区
在你的代码中,你使用的是9600波特率,这对于发送大量数据可能会比较慢。如果数据发送不及时,可能会导致数据丢失。可以尝试提高波特率来提高数据传输速度。

例如,将波特率设置为115200:
USART_InitStructure.USART_BaudRate = 115200;


家有两宝呀 发表于 2024-7-31 23:59 | 显示全部楼层
USART发送的数据缓冲区是否存在溢出的可能。如果发送数据量太大且发送速度过慢,可能会导致数据丢失。通过硬件流控(如RTS/CTS)可以避免缓冲区溢出。
你的代码中没有启用流控。
flycamelaaa 发表于 2024-8-19 13:04 | 显示全部楼层
缓冲区溢出
powerantone 发表于 2024-8-19 13:04 | 显示全部楼层
波特率不匹配
stormwind123 发表于 2024-8-19 13:05 | 显示全部楼层
如果使用中断或DMA方式发送数据,配置错误(如优先级设置不当、缓冲区地址错误等)可能导致发送失败
probedog 发表于 2024-8-19 13:05 | 显示全部楼层
电源不稳定或时钟配置错误也可能影响串口通信的稳定性。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2122

主题

8121

帖子

11

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