OpenEdv-开源电子网

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

STM32F407串口通信

[复制链接]

2

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-7-17
在线时间
7 小时
发表于 2017-7-17 16:44:08 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 AlexVinci 于 2017-7-17 16:44 编辑

我想通过串口通信向单片机发送一个数据,然后将这个数据存入一个变量,将该变量作为控制TIM3的脉冲个数。[mw_shl_code=c,true]while(1)
        {
                if(USART_RX_STA)
                {                                          
                        len=USART_RX_STA&0x3fff;
                        for(t=0;t<len;t++)
                        {
                                buffer[t]=USART_RX_BUF[t];
                                USART_SendData(USART1, buffer[t]);        
                        }
                        cnttemp = (USART_RX_BUF[0]-'0')*100+(USART_RX_BUF[1]-'0')*10+(USART_RX_BUF[2]-'0');
                        USART_RX_STA=0;
                }
                if(cnttemp>0){
                        TIM_SetAutoreload(TIM3, 4);
                        TIM_Cmd(TIM3,ENABLE);
                }
        }[/mw_shl_code]
[mw_shl_code=c,true]void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
        {
                GPIO_ResetBits(GPIOB,GPIO_Pin_4);
                GPIO_SetBits(GPIOB,GPIO_Pin_4);
                if(cnttemp)
                        cnttemp=cnttemp-1;
                LED1=!LED1;
        }
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}[/mw_shl_code]

最佳答案

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

extern u16 cnttemp;这是变量定义的语句。 实际情况就是脉冲个数一直有问题,与发送的值不匹配。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-7-17
在线时间
7 小时
 楼主| 发表于 2017-7-17 16:44:09 | 显示全部楼层
extern u16 cnttemp;这是变量定义的语句。
实际情况就是脉冲个数一直有问题,与发送的值不匹配。
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-7-17
在线时间
7 小时
 楼主| 发表于 2017-7-17 16:44:09 | 显示全部楼层
问题已解决,代码如下
[mw_shl_code=c,true]TIM3_SetCnt(buffer[3],buffer[4]);[/mw_shl_code]
[mw_shl_code=c,true]void TIM3_SetCnt(u8 a,u8 b){
                u16 temp;
                temp = a;
                temp<<=8;
                temp |= b;
                cnttemp = temp;
}[/mw_shl_code]
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165359
金钱
165359
注册时间
2010-12-1
在线时间
2110 小时
发表于 2017-7-18 01:21:57 | 显示全部楼层
仿真找问题
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-7-16
在线时间
5 小时
发表于 2017-7-18 10:34:32 | 显示全部楼层
你把if(USART_RX_STA)改成f(USART_RX_STA&0x8000)试试
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-7-16
在线时间
5 小时
发表于 2017-7-18 16:16:04 | 显示全部楼层
本帖最后由 尾张大 于 2017-7-18 16:18 编辑

最近在调串口实验,你要确保你取出的cnttemp是有效的。后面的帮不了你,但是cnttemp 的值我能取出有效的。下面是一段程序,内容就是你通过串口发给单片机什么数,单片机把数取出来,再通过串口反馈给你。int main(void)
{
        int t=0;
        int        len=0;
        int  cnttemp=0;
        int temp[10]={0};
        uart_init(38400);
        delay_init(84);

        while(1)
        {
               
        
                if(USART_RX_STA&0x8000)
                {                                          
                        len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
                        
                        for(t=0;t<len;t++)
                        {
                                USART_SendData(USART1, USART_RX_BUF[t]);         //向串口1发送数据
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
                        }
                        
                        USART_RX_STA=0;
                        for(t=0;t<len;t++)
                        {
                        temp[t]=USART_RX_BUF[t]-'0';
                        cnttemp=cnttemp+temp[t]*pow(10,len-t-1);        
                        }
                }
               
                printf("cnttemp:%d\r\n",cnttemp);
                cnttemp=0;
                delay_ms(500);
               
        }
}
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-12-19 00:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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