OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1901|回复: 2

STM32F103串口收发数组内容

[复制链接]

2

主题

3

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2023-7-23
在线时间
5 小时
发表于 2023-7-23 15:48:58 | 显示全部楼层 |阅读模式
我用stm32cubemx生成的串口,在串口接收回调函数里写了一段接收字符串的函数,以\r\n结尾判断是否接收结束
然后将接收的内容再串口发出检查内容是否正确

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

if( huart == &huart1)//判断中断源
    {
        uart1_buf[uart1_recive_count++]=g_ucUsart1ReceiveData;//uint8_t g_ucUsart1ReceiveData保存保存串口一接收的数据
        if((uart1_buf[uart1_recive_count-2]=='\r')&&(uart1_buf[uart1_recive_count-1]=='\n'))
        {
        HAL_UART_Transmit(&huart1,uart1_buf,uart1_buf[uart1_recive_count-1],0xFFFF);
            uart1_recive_count=0;
        }
        else if(uart1_recive_count>=255)
            uart1_recive_count=0;

   }
}

效果无法接收到单片机发出的数组,将  HAL_UART_Transmit(&huart1,uart1_buf,uart1_buf[uart1_recive_count-1],0xFFFF);换成

                  sprintf((char *)c_Data,"%c",uart1_buf[0]);
                  HAL_UART_Transmit(&huart1,&uart1_buf[0],1,0xFFFF);
以上两句检测是否能够接收到数据,效果正常

接着重定向printf
用这个printf((char*)uart1_buf);发出数组数据发现依然没效果
但寻找问题的时候发现


想接收完直接串口发出。用HAL_UART_Transmit想直接发出数组,但是发现并没有然后数据发出

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

if( huart == &huart1)//判断中断源
    {
        uart1_buf[uart1_recive_count++]=g_ucUsart1ReceiveData;//uint8_t g_ucUsart1ReceiveData保存保存串口一接收的数据
        if((uart1_buf[uart1_recive_count-2]=='\r')&&(uart1_buf[uart1_recive_count-1]=='\n'))
        {
            sprintf((char *)c_Data,"a");
            printf((char*)uart1_buf);
            uart1_recive_count=0;
        }
        else if(uart1_recive_count>=255)
            uart1_recive_count=0;

   }
}
这样可以将printf的数组内容发出,   将sprintf((char *)c_Data,"a");删去就无效果
想知道这是什么原因,有什么可以很好解决的办法


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

3

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2023-7-23
在线时间
5 小时
 楼主| 发表于 2023-7-23 17:15:13 | 显示全部楼层
    if( huart == &huart1)//判断中断源
    {
        if(uart1_recive_count>=255)
        {
            uart1_recive_count=0;
            memset(uart1_buf,0x00,sizeof (uart1_buf));
        }
        else
        {
            uart1_buf[uart1_recive_count++]=g_ucUsart1ReceiveData;
            if((uart1_buf[uart1_recive_count-2]=='\r')&&(uart1_buf[uart1_recive_count-1]=='\n'))
            {
                printf((char *)uart1_buf);
                uart1_recive_count=0;
                memset(uart1_buf,0x00,sizeof (uart1_buf));
            }

        }
        HAL_UART_Receive_IT( &huart1,(uint8_t *)&g_ucUsart1ReceiveData, 1);//继续进行中断接收
    }
改成这样就解决了,但之前的为什么不可以依旧不知道

回复 支持 反对

使用道具 举报

3

主题

800

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3775
金钱
3775
注册时间
2017-3-7
在线时间
1645 小时
发表于 2023-7-24 09:52:04 | 显示全部楼层
额,具体什么问题还不清楚,只是别在接受中断里直接发送,加个全局变量当标志,在主程序里判断是否接收完成,然后发送试试
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 04:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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