[STM32] 用串口终端发送数据让三个变量一次性得到赋值

[复制链接]
3606|17
 楼主| 734664813 发表于 2015-4-19 17:02 | 显示全部楼层 |阅读模式
如题,启用了串口的接收中断,但是不知道怎么样在中断服务程序里给三个变量完成一次性赋值

想要实现的功能如一个scanf函数:scanf(“%d%d%d”,&a,&b,&c);


问题是,一般的串口接收数据函数如下:
void USART1_IRQHandler(void)
{
        uint8_t ch;
       
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {        
            //ch = USART1->DR;
                        ch = USART_ReceiveData(USART1);
                  printf( "%c", ch );   
        }
         
}

怎么样改写这个函数能达到scanf函数一次性赋值三个变量的效果,@lr2131 @qq756512897 请教各位大哥
NE5532 发表于 2015-4-19 17:18 | 显示全部楼层
串口的帧结构决定了一次只能收一字节数据,楼主想收一次给三个变量赋值?a=receive; b=a; c=a; 不就可以了?不过楼主要的多半不是这个,请楼主重新描述自己的问题吧,看不懂。
 楼主| 734664813 发表于 2015-4-19 18:38 | 显示全部楼层
NE5532 发表于 2015-4-19 17:18
串口的帧结构决定了一次只能收一字节数据,楼主想收一次给三个变量赋值?a=receive; b=a; c=a; 不就可以了 ...

我把串口的中断函数写了下,但是并没有实现  i==3,很疑惑

void USART1_IRQHandler(void)
{
        uint8_t in_data[3];
        uint8_t i=0;
        printf( "\r\n进入串口中断函数\r\n");

        OSIntEnter();
       
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//
        {        
         
                        in_data= USART_ReceiveData(USART1);
                        i++;
        }
        if(i==3)
        {
                i=0;
                Pre_v=in_data[0];
                Self_v=in_data[1];
                Cur_d=in_data[2];
                usart_flag=1;//
        }
       
        OSIntExit();
}
NE5532 发表于 2015-4-19 19:40 | 显示全部楼层
i要加static,否则每次进来自动赋0,你自然得不到3.
JY-DX-JY 发表于 2015-4-19 21:33 | 显示全部楼层
楼主玩的很高深。
 楼主| 734664813 发表于 2015-4-20 09:54 | 显示全部楼层
NE5532 发表于 2015-4-19 19:40
i要加static,否则每次进来自动赋0,你自然得不到3.

昨晚加了static,验证确实可以达到i=3,但是问题又来了,发现数组的值完全不对

按照这个中断函数的思路,是连续三次进入中断,每一次给一个数组的值赋值,但情况不如人意

还没有进行过调试,不知道问题出在哪里
 楼主| 734664813 发表于 2015-4-20 10:21 | 显示全部楼层
NE5532 发表于 2015-4-19 19:40
i要加static,否则每次进来自动赋0,你自然得不到3.

这是调试的结果:
我给a[0]赋值为0,但是现实是被赋值成了0x0030
C:\Users\Administrator\Desktop

很奇怪
 楼主| 734664813 发表于 2015-4-20 10:22 | 显示全部楼层
NE5532 发表于 2015-4-19 19:40
i要加static,否则每次进来自动赋0,你自然得不到3.


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
as564335sa 发表于 2015-4-20 10:31 | 显示全部楼层
734664813 发表于 2015-4-20 10:21
这是调试的结果:
我给a[0]赋值为0,但是现实是被赋值成了0x0030

0x30刚好是ASCII的'0'
NE5532 发表于 2015-4-20 10:32 | 显示全部楼层
楼主不会举一反三啊,你数组就不static了?重修C语言3遍:lol
 楼主| 734664813 发表于 2015-4-20 11:31 | 显示全部楼层
as564335sa 发表于 2015-4-20 10:31
0x30刚好是ASCII的'0'

也就是说从串口终端发送出去的是字符而不是int
 楼主| 734664813 发表于 2015-4-20 11:33 | 显示全部楼层
NE5532 发表于 2015-4-20 10:32
楼主不会举一反三啊,你数组就不static了?重修C语言3遍

数组的值是被成功赋值进去的,应该不是没加static的原因,我在终端上发送0,数组接收的值是0x30
xmfbit 发表于 2015-4-20 12:39 | 显示全部楼层
734664813 发表于 2015-4-20 11:31
也就是说从串口终端发送出去的是字符而不是int

不清楚楼主用的是啥工具调试的串口。是不是没有用十六进制发送?否则是发送的ASCII码的。
as564335sa 发表于 2015-4-20 13:02 | 显示全部楼层
734664813 发表于 2015-4-20 11:31
也就是说从串口终端发送出去的是字符而不是int

看你的串口终端
 楼主| 734664813 发表于 2015-4-20 13:40 | 显示全部楼层
xmfbit 发表于 2015-4-20 12:39
不清楚楼主用的是啥工具调试的串口。是不是没有用十六进制发送?否则是发送的ASCII码的。
...

确实是终端的问题,用16进制发送就ok
但是之前用fgetc函数重定向,调用scanf函数倒是没有这样的问题,谢谢你的解答
lgq1542380129 发表于 2015-4-20 15:09 | 显示全部楼层
楼主定义数组的地址未增加。
NE5532 发表于 2015-4-20 16:16 | 显示全部楼层
楼主啊,2楼就给你说了,串口一次收一个字节,缘何不看啊。
 楼主| 734664813 发表于 2015-4-20 17:30 | 显示全部楼层
NE5532 发表于 2015-4-20 16:16
楼主啊,2楼就给你说了,串口一次收一个字节,缘何不看啊。

没看出来问题会出在终端上,对不住啊版主大兄弟
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

41

帖子

0

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