OpenEdv-开源电子网

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

串口通信里边两个函数,USART_ReceiveData和usart3_SendByte是怎么用的?

[复制链接]

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
发表于 2016-1-22 17:38:36 | 显示全部楼层 |阅读模式
5金钱
我去看了两个函数传进来的都是u16,可是我printf的时候明显发送的是最大65535,而接受的最大只有256.课时函数库里写着都是16位啊,这是为什么?附上程序帮忙看一下,第一个是接受端,第二个是发送端
[mw_shl_code=c,true]#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "timer.h"
#include "usart.h"
/************************************************
ALIENTEK战舰STM32开发板实验10
输入捕获实验  
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司  
作者:正点原子 @ALIENTEK
************************************************/
extern u8  TIM5CH1_CAPTURE_STA;                //输入捕获状态                                                   
extern u16        TIM5CH1_CAPTURE_VAL;        //输入捕获值       
u16 RxData;         
unsigned   char   b[2];
int main(void)
{       
         int i=0;
        u16 temp=0;
        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
//         LED_Init();                             //LED端口初始化
  USART1_Config();
        USART3_Config();
        TIM3_PWM_Init(89,0);                 //不分频。PWM频率=72000/(899+1)=80Khz
        TIM_SetCompare2(TIM3,44);
        TIM5_Cap_Init(0XFFFF,72-1);        //以1Mhz的频率计数


           while(1)
        {
//                printf("串口好使");
//                 delay_ms(10);
//                TIM_SetCompare2(TIM3,TIM_GetCapture2(TIM3)+1);
//
//                if(TIM_GetCapture2(TIM3)==300)TIM_SetCompare2(TIM3,0);       
                        //usart3_SendByte(0x55);
                //        printf("好使\n");
                        delay_ms(50);                  
                if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿
                {
                        temp=TIM5CH1_CAPTURE_STA&0X3F;
                        temp*=65536;//溢出时间总和
                        temp+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间
                //        printf("HIGH:%d us\r\n",temp);//打印总的高点平时间
                        printf("%d\n",temp);
                        //usart3_SendByte((unsigned char)temp);
//                        for(i=0;i<2;i++)
//                                 {
//                                  b   =   *((char*)&temp+i);
//                                  usart3_SendByte(b);
//                                         printf("%d\n",b);
//                                 }
                        usart3_SendByte(temp);
                        TIM5CH1_CAPTURE_STA=0;//开启下一次捕获
                        delay_ms(50);
                }
        }
}[/mw_shl_code][mw_shl_code=c,true]u16 RxData;         
unsigned   char   b[2];
         int i=0;
int main(void)
{       

        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
//         LED_Init();                             //LED端口初始化
  USART1_Config();
        USART3_Config();
        TIM3_PWM_Init(89,0);                 //不分频。PWM频率=72000/(899+1)=80Khz
        TIM_SetCompare2(TIM3,44);
        TIM5_Cap_Init(0XFFFF,72-1);        //以1Mhz的频率计数


           while(1)
        {
                if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断
                {
                 RxData        =USART_ReceiveData(USART3);
//                        for(i=0;i<2;i++)
//                                {        b = USART_ReceiveData(USART3);
//                       
//                                }
//                                  RxData        =b[1]<<16;
//                        RxData=RxData        +b[0];       
                         }
//RxData = USART_ReceiveData(USART3);
//                while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET);
       
                         printf("%d\n",RxData);
                                 delay_ms(50);
        }
}
[/mw_shl_code]

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

使用道具 举报

3

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
255
金钱
255
注册时间
2014-2-2
在线时间
41 小时
发表于 2016-1-22 18:53:46 | 显示全部楼层
确切的说TX端发送了两次,而你程序接收端只接受了一次。至于为什么是16BIT,而只接收8bit,你可以仔细看看库里怎么写的
回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
 楼主| 发表于 2016-1-22 19:02:18 | 显示全部楼层
godsend 发表于 2016-1-22 18:53
确切的说TX端发送了两次,而你程序接收端只接受了一次。至于为什么是16BIT,而只接收8bit,你可以仔细看看库 ...

我刚看了一下两个库函数,还是没看懂为什么发送了两次。。。发送端不就是把发送的数据放到了DR寄存器里嘛。麻烦解释一下,我也在看一遍看看能不能看明白,谢谢
回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
 楼主| 发表于 2016-1-22 19:18:46 | 显示全部楼层
QQ截图20160122191531.png
这是怎么回事..可是文件中确实写的是16位啊
s.png
回复

使用道具 举报

3

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
255
金钱
255
注册时间
2014-2-2
在线时间
41 小时
发表于 2016-1-22 22:23:45 | 显示全部楼层
864384664 发表于 2016-1-22 19:18
这是怎么回事..可是文件中确实写的是16位啊

你看看printf重定向里面,是他判断了你的数据是两个字节发送了两次,接收程序只做了一次接收,发送和接收字节和库函数的数据你没看&0x01ff嘛,就只剩一个字节了,(串口还可以发送9位数据)
回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
 楼主| 发表于 2016-1-23 08:35:38 | 显示全部楼层
godsend 发表于 2016-1-22 22:23
你看看printf重定向里面,是他判断了你的数据是两个字节发送了两次,接收程序只做了一次接收,发送和接收 ...

&0x01ff不就是只保留低九位嘛.它怎么是发送一个字节呢
回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
 楼主| 发表于 2016-1-23 08:45:46 | 显示全部楼层
godsend 发表于 2016-1-22 22:23
你看看printf重定向里面,是他判断了你的数据是两个字节发送了两次,接收程序只做了一次接收,发送和接收 ...

能教教我怎么看printf重定义吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 17:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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