OpenEdv-开源电子网

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

如何在USART1_IRQHandle裡面把輸入的字串寫入陣列,又可以清除陣列裡面之前的字串??

[复制链接]

52

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2018-10-17
在线时间
40 小时
发表于 2023-10-28 23:47:19 | 显示全部楼层 |阅读模式
1金钱
我寫一段程式碼,利用"串口助理"輸入一段文字在USART1_IRQHandler,
裡面,我再把文字寫入name前,先把name清除,利用 memset(name, 0, sizeof(name));
因為每次寫入字串到陣列之前要先清除之前的陣列,不然列印出來會有之前字串的一部分.
我把name設定成為extern 全局變數陣列.
但是搞不懂為什麼我把memset(name, 0, sizeof(name))寫在USART1_IRQHandler
讀取的name字串永遠一片空白,好像都被memset(name, 0, sizeof(name))清的乾乾淨淨的
但是我把memset(name, 0, sizeof(name))寫在main函式,卻可以在name裡面讀取到我寫入
的字串.








uint8_t number=0;
uint8_t x=0;
char buff [100] = "";
void USART1_IRQHandler(void)     
{
             
        char * data = My_Usart1_ReadLine();
                                My_Usart1_Printf(data);
               
            
}


void My_Usart1_Printf(char *string)
        {
    while(*string){
        /* ????? USART3 */
        USART_SendData(USART1, (unsigned short int) *string++);
        /* ???????? */
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
    }
}


char * My_Usart1_ReadLine(){   
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
                        {         
        char c = USART_ReceiveData(USART1);   
        if(c != '\r' && c != '\n')
                                        {
            sprintf (buff, "%s%c", buff, c);
                                         
        }
                                else
                          {
            char buff2 [100] = "";
                                          uint8_t number=strlen(buff);       
                                       
                                           memset(name, 0, sizeof(name));
                                       
            memcpy(name,buff, strlen(buff));//把輸入的字串放進全區域陣列name
            memcpy(buff2,buff, strlen(buff)); // ? buff ??? buff2
            memset(buff, 0, strlen(buff)); // ?? buff ???????  
            USART_ClearFlag(USART1,USART_IT_RXNE);               
            return buff2;
        }
                               
    }
    return "";
}










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

使用道具 举报

28

主题

360

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1028
金钱
1028
注册时间
2021-2-4
在线时间
146 小时
发表于 2023-10-30 17:31:54 | 显示全部楼层
我看不出什么问题 但是我觉得你的程式码写的很烂,所以给你一些建议
不要在中断里面操作字符串,我看到了你在中断里处理接收与发送,这些操作很费时间
你可以将接收到的数据全部存入buff 中,然后将Flag = SET
随后copy到name中进行解析.当你解析完成后在main()里面发送

你的变量也混,他们没有一个合适的名称,也没有一个合适的作用
变量的名称和作用应该是固定的
比如可以定义一个 Rx_buffer 仅仅用来存放接收到的数据



回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-29 20:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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