打印
[STM32]

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

[复制链接]
3061|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
如题,启用了串口的接收中断,但是不知道怎么样在中断服务程序里给三个变量完成一次性赋值

想要实现的功能如一个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.

使用特权

评论回复
5
JY-DX-JY| | 2015-4-19 21:33 | 只看该作者
楼主玩的很高深。

使用特权

评论回复
6
734664813|  楼主 | 2015-4-20 09:54 | 只看该作者
NE5532 发表于 2015-4-19 19:40
i要加static,否则每次进来自动赋0,你自然得不到3.

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

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

还没有进行过调试,不知道问题出在哪里

使用特权

评论回复
7
734664813|  楼主 | 2015-4-20 10:21 | 只看该作者
NE5532 发表于 2015-4-19 19:40
i要加static,否则每次进来自动赋0,你自然得不到3.

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

很奇怪

使用特权

评论回复
8
734664813|  楼主 | 2015-4-20 10:22 | 只看该作者
NE5532 发表于 2015-4-19 19:40
i要加static,否则每次进来自动赋0,你自然得不到3.


使用特权

评论回复
9
as564335sa| | 2015-4-20 10:31 | 只看该作者
734664813 发表于 2015-4-20 10:21
这是调试的结果:
我给a[0]赋值为0,但是现实是被赋值成了0x0030

0x30刚好是ASCII的'0'

使用特权

评论回复
10
NE5532| | 2015-4-20 10:32 | 只看该作者
楼主不会举一反三啊,你数组就不static了?重修C语言3遍:lol

使用特权

评论回复
11
734664813|  楼主 | 2015-4-20 11:31 | 只看该作者
as564335sa 发表于 2015-4-20 10:31
0x30刚好是ASCII的'0'

也就是说从串口终端发送出去的是字符而不是int

使用特权

评论回复
12
734664813|  楼主 | 2015-4-20 11:33 | 只看该作者
NE5532 发表于 2015-4-20 10:32
楼主不会举一反三啊,你数组就不static了?重修C语言3遍

数组的值是被成功赋值进去的,应该不是没加static的原因,我在终端上发送0,数组接收的值是0x30

使用特权

评论回复
13
xmfbit| | 2015-4-20 12:39 | 只看该作者
734664813 发表于 2015-4-20 11:31
也就是说从串口终端发送出去的是字符而不是int

不清楚楼主用的是啥工具调试的串口。是不是没有用十六进制发送?否则是发送的ASCII码的。

使用特权

评论回复
14
as564335sa| | 2015-4-20 13:02 | 只看该作者
734664813 发表于 2015-4-20 11:31
也就是说从串口终端发送出去的是字符而不是int

看你的串口终端

使用特权

评论回复
15
734664813|  楼主 | 2015-4-20 13:40 | 只看该作者
xmfbit 发表于 2015-4-20 12:39
不清楚楼主用的是啥工具调试的串口。是不是没有用十六进制发送?否则是发送的ASCII码的。
...

确实是终端的问题,用16进制发送就ok
但是之前用fgetc函数重定向,调用scanf函数倒是没有这样的问题,谢谢你的解答

使用特权

评论回复
16
lgq1542380129| | 2015-4-20 15:09 | 只看该作者
楼主定义数组的地址未增加。

使用特权

评论回复
17
NE5532| | 2015-4-20 16:16 | 只看该作者
楼主啊,2楼就给你说了,串口一次收一个字节,缘何不看啊。

使用特权

评论回复
18
734664813|  楼主 | 2015-4-20 17:30 | 只看该作者
NE5532 发表于 2015-4-20 16:16
楼主啊,2楼就给你说了,串口一次收一个字节,缘何不看啊。

没看出来问题会出在终端上,对不住啊版主大兄弟

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

41

帖子

0

粉丝