OpenEdv-开源电子网

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

萌新菜鸟求助,F4系列用串口和上位机通信问题

[复制链接]

1

主题

9

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-3-20
在线时间
4 小时
发表于 2018-2-1 18:23:04 | 显示全部楼层 |阅读模式
20金钱
//由于情况紧急,明天就要结果,实在来不及去自己寻找摸索答案,故提出如此简单问题,望管理员和大牛们手下留情。

一个小项目,用的原子哥F4的原理图画了块板子。
用了部分的功能(灯,喇叭,串口等)
用实验4的串口通信原理的源程序(上位机发送指令以0x0d和0x0a结尾),上位机用串口调试助手调试,功能正常。


现在我想要达到的目的是:
上位机控制下位机
上位机发送00,PE2高电平PE3,PE4,PE5低电平。
上位机发送01,PE3高电平PE2,PE4,PE5低电平。
上位机发送02,PE4高电平PE2,PE3,PE5低电平。
上位机发送03,PE5高电平PE2,PE3,PE4低电平。
上位机发送04,PE2,PE3,PE4,PE5低电平。


发送的数字指令可以换,主要的问题是上位机发送的数据下位机收到后怎么识别指令,并作出相应动作。
初步的想法是做与运算,但是实际去写却写不出来。


刚接触单片机,属于赶鸭子上架,希望有好心人能帮忙解答下。
(感觉问题太低端,会被喷。实数无奈之举,此次危机过后日后定当好好学习单片机。)







最佳答案

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

[mw_shl_code=c,true]void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // 如果接收到1个字节 { aRxBuffer[RxCounter++] = USART1->DR;// 把接收到的字节保存,数组地址加1 } else if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)// 如果接收到1帧数据 { u8 Clear=USART1->SR;// 读SR寄存器 Clear=USART1->DR;// 读DR寄存器(先读SR再读DR,就是为了清除I ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

111

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1085
金钱
1085
注册时间
2015-5-22
在线时间
607 小时
发表于 2018-2-1 18:23:05 | 显示全部楼层
[mw_shl_code=c,true]void USART1_IRQHandler(void)
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // 如果接收到1个字节
        {
                aRxBuffer[RxCounter++] = USART1->DR;// 把接收到的字节保存,数组地址加1
        }
   else if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)// 如果接收到1帧数据
        {
                u8 Clear=USART1->SR;// 读SR寄存器
                   Clear=USART1->DR;// 读DR寄存器(先读SR再读DR,就是为了清除IDLE中断)
                ReceiveState=1;// 标记接收到了1帧数据
        }

        if(ReceiveState == 1)
           {
            
             if((aRxBuffer[0]== 0x0D) &&(aRxBuffer[2]== 0x0A))
                {
                  u8 i =0;
                  
                  i = aRxBuffer[1];
                  switch(i)
                    {
                    case  0:
                     //执行语句;
                      break;
                      default:; break;
                    }
                }
            
             ReceiveState = 0;
             RxCounter = 0;
           }
        }[/mw_shl_code]
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7549
金钱
7549
注册时间
2016-11-30
在线时间
642 小时
发表于 2018-2-1 18:25:54 | 显示全部楼层
按说这是很简单的逻辑啊,就是判断接受的数据执行不同的IO口操作呗,可以用if,最好还是switch
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-3-20
在线时间
4 小时
 楼主| 发表于 2018-2-1 20:21:33 | 显示全部楼层
lvkanger 发表于 2018-2-1 18:25
按说这是很简单的逻辑啊,就是判断接受的数据执行不同的IO口操作呗,可以用if,最好还是switch

就是判断的这个过程,弄不明白。
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-3-20
在线时间
4 小时
 楼主| 发表于 2018-2-1 20:25:39 | 显示全部楼层
ADS1993 发表于 2018-2-1 19:47
[mw_shl_code=c,true]void USART1_IRQHandler(void)
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) ! ...

这个中断函数,原子哥的教程里倒是有,但是还是搞不明白怎么让下位机识别我发的指令。

谢谢啦
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-3-20
在线时间
4 小时
 楼主| 发表于 2018-2-1 20:44:15 | 显示全部楼层
就是用原子哥的usart.c文件,然后在main.c里面怎么写识别发来的数据的程序啊?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-2-2 01:00:39 | 显示全部楼层
用我们的usmart,直接就解决了。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7549
金钱
7549
注册时间
2016-11-30
在线时间
642 小时
发表于 2018-2-2 09:11:49 | 显示全部楼层
kepler 发表于 2018-2-1 20:44
就是用原子哥的usart.c文件,然后在main.c里面怎么写识别发来的数据的程序啊?

3楼的例程不是正符合你的这种情况嘛,你主需要把case修改下就实现了啊
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-3-20
在线时间
4 小时
 楼主| 发表于 2018-2-2 11:16:30 | 显示全部楼层
正点原子 发表于 2018-2-2 01:00
用我们的usmart,直接就解决了。。。

!!!之前竟然没发现这个实验,谢谢原子哥!救人于水火啊。
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-3-20
在线时间
4 小时
 楼主| 发表于 2018-2-2 11:16:42 | 显示全部楼层
lvkanger 发表于 2018-2-2 09:11
3楼的例程不是正符合你的这种情况嘛,你主需要把case修改下就实现了啊

嗯嗯,谢谢啦
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 10:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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