OpenEdv-开源电子网

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

STM32 如何将串口接收到的数据传到主函数?

[复制链接]

3

主题

19

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2018-2-9
在线时间
7 小时
发表于 2018-2-27 13:06:40 | 显示全部楼层 |阅读模式
8金钱
我首先定义了个全局变量 u8 t;然后 在串口中断服务函数中进行了发送和接收操作

void USART1_IRQHandler()
{
       
        if(USART_GetITStatus(USART1,USART_IT_RXNE))
        {
                flag=1;
                t=USART_ReceiveData(USART1);
                //delay_ms(1);
                USART_SendData(USART1,t);
                USART_ClearITPendingBit(USART1,USART_IT_RXNE);
        }
               

}


最后在主函数中发送t   USART_SendData(USART1,t);
却发现什么都收不到 程序跑起来以后是这样(如图)

顺便把源程序也贴在这 求大神解答。。。

QQ截图20180227130457.png

舵机控制(串口).zip

6.21 MB, 下载次数: 61

最佳答案

查看完整内容[请看2#楼]

uint8_t Rec_buf[32]; uint8_t Rec_buf_count=0; void USART1_IRQHandler() { uint8_t temp; if(USART_GetITStatus(USART1,USART_IT_RXNE)) { flag=1; temp=USART_ReceiveData(USART1);//t是全局的,在这里不要赋值。改成temp //delay_ms(1); //USART_SendData(USART1,t);----把这个给屏蔽了,你这个是什么鬼? ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

570

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2914
金钱
2914
注册时间
2016-5-13
在线时间
184 小时
发表于 2018-2-27 13:06:41 | 显示全部楼层
uint8_t Rec_buf[32];
uint8_t Rec_buf_count=0;

void USART1_IRQHandler()
{
        uint8_t temp;
        if(USART_GetITStatus(USART1,USART_IT_RXNE))
        {
                flag=1;
                temp=USART_ReceiveData(USART1);//t是全局的,在这里不要赋值。改成temp
                //delay_ms(1);
                //USART_SendData(USART1,t);----把这个给屏蔽了,你这个是什么鬼?
                Rec_buf[Rec_buf_count]=temp;                Rec_buf++;
                Rec_buf&=0x1f;
                USART_ClearITPendingBit(USART1,USART_IT_RXNE);
        }
      
}

main里可以调用下面这个函数发送,也就是send_char_USART1(t);
void send_char_USART1(unsigned char ch)
{
        USART_SendData(USART1,(uint8_t) ch);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        //while((USART1->SR&0X40)==0);
        //USART1->DR = (u8) ch;
}

虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-2-27 13:36:00 | 显示全部楼层
你发的是1000,你的t是u8的,安妮的程序,是吧1000分成 1  0  0  0四次了,中断内把1 0 0 0 合成1000
回复

使用道具 举报

3

主题

19

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2018-2-9
在线时间
7 小时
 楼主| 发表于 2018-2-27 16:12:56 | 显示全部楼层
电脑小白 发表于 2018-2-27 15:51
uint8_t Rec_buf[32];
uint8_t Rec_buf_count=0;

完全小白 有点看不懂大神你的程序。。
1.Rec_buf&=0x1f; 这句话是什么意思,全部和1与一下的作用是什么?
2. //USART_SendData(USART1,t); 这个不是发送串口数据吗 我看正点原子的串口通信实验那也用了这个代码
3.你提供的那个函数while那有点看不懂
4.那个计数的不用归零吗

希望大神能讲解一下,谢谢~
回复

使用道具 举报

3

主题

19

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2018-2-9
在线时间
7 小时
 楼主| 发表于 2018-2-27 16:26:59 | 显示全部楼层
275891381 发表于 2018-2-27 13:36
你发的是1000,你的t是u8的,安妮的程序,是吧1000分成 1  0  0  0四次了,中断内把1 0 0 0 合成1000

那我要实现串口发送1000,主函数内的t能被赋值为1000的目的,该怎样操作呢
回复

使用道具 举报

8

主题

570

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2914
金钱
2914
注册时间
2016-5-13
在线时间
184 小时
发表于 2018-2-27 16:46:44 | 显示全部楼层
1、Rec_buf&=0x1f;-----这句等于if(Rec_buf>31)Rec_buf=0; 就是限定Rec_buf的范围
2、正点原子里的USART_SendData(USART1,t); 这句写在串口中断里是接收到数据就返回数据。你不需要返回数据吧(这个是回显的功能,就相当于echo)
3、while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);---这里的while是死等,你会问在死等什么呢,这个是在死等串口发送数据空闲。就是发送完了这个字节才跳出while

虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

8

主题

570

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2914
金钱
2914
注册时间
2016-5-13
在线时间
184 小时
发表于 2018-2-27 16:54:56 | 显示全部楼层
void send_string_USART1( unsigned char *str, unsigned int strlen)
{
        unsigned int k= 0 ;
        do { send_char_USART1(*(str + k)); k++; }
        while (k < strlen);
}
这个函数send_string_USART1可以发送字符串。
send_char_USART1---这个函数只能发送一个字节。就是255以内的。你要发送1000可以考虑高地位拆分发送或者转换为字符串发送。
想要完成串口通信要自己定通信协议的。就是你打算用16进制通信还是用ASCII格式通信。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

8

主题

570

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2914
金钱
2914
注册时间
2016-5-13
在线时间
184 小时
发表于 2018-2-27 17:11:11 | 显示全部楼层
给你写个最简单的通信吧。如下:
t=1000;
uint8_t Send_buf[10];
sprintf(Send_buf,"t=%04d",t);
send_string_USART1(Send_buf,6);
for(i=0;i<10;i++)Send_buf[i]=0;//就是清除缓冲
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

3

主题

19

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2018-2-9
在线时间
7 小时
 楼主| 发表于 2018-2-28 11:40:04 | 显示全部楼层
电脑小白 发表于 2018-2-27 17:11
给你写个最简单的通信吧。如下:
t=1000;
uint8_t Send_buf[10];

哇谢谢谢谢大神的指导,我比较菜,待我领悟一会儿。。
回复

使用道具 举报

3

主题

19

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2018-2-9
在线时间
7 小时
 楼主| 发表于 2018-2-28 13:31:56 | 显示全部楼层
电脑小白 发表于 2018-2-27 17:11
给你写个最简单的通信吧。如下:
t=1000;
uint8_t Send_buf[10];

send_string_USART1(Send_buf,6) 这句话我有点看不懂。。。好像也没这个函数啊。。还有我在想既然串口是一个一个发送 再一个一个接收 那么到数组里就是1,0,0,0  这个时候的1000已经不是1000了 而是二进制的一零零零。。好奇怪 想不明白究竟该怎么通过串口把1000传过去(其实传255内的数字也可以 不一定是1000) 但是就是传不出来
回复

使用道具 举报

8

主题

570

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2914
金钱
2914
注册时间
2016-5-13
在线时间
184 小时
发表于 2018-3-1 09:22:22 | 显示全部楼层
爱兜风ADF 发表于 2018-2-28 13:31
send_string_USART1(Send_buf,6) 这句话我有点看不懂。。。好像也没这个函数啊。。还有我在想既然串口是 ...

物理上是一个一个位传送的。但是我们程序里处理是对字节进行操作和读取的。我之前已经说明了,可以把1000分成高8位和低8位进行发送(16进制),或者发送四个字符(ASCII)。你对串口通信是一点都不了解。建议你去看下串口通信方面的书籍。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

4

主题

116

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4074
金钱
4074
注册时间
2017-11-15
在线时间
331 小时
发表于 2018-3-1 09:34:14 | 显示全部楼层
可以使用全局数组,然后设置一个标志位,接收完成了,主函数才能读。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 18:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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