OpenEdv-开源电子网

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

原子哥的stm32f103mini开发板用串口连外设的疑惑,求前辈给新人带路指教

[复制链接]

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2018-9-16
在线时间
28 小时
发表于 2018-12-15 23:00:30 | 显示全部楼层 |阅读模式
3金钱
模块的功能:该模块为串口输出数据,使用者通过串口连接后,发送输出指令,例如 0xA5+0x45+0xEA 给模块,模块将连续输出温度数据,
模块输出格式,每帧包含 9 个字节(十六进制)
经测验触摸屏,模块是完好可用的,各种初始化函数也是正确的
不知为何:LED1闪烁了4次,是不是说明收到了8次数据?  但LED0始终不亮,触摸屏上也不打印数据,纠结了好长时间,望前辈们开开法眼,指点一二,拜托!
void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p);//显示一个字符串函数

下面是程序
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
u8 *rebuff[9];
unsigned char sign=0;
int i=0;
void USART1_IRQHandler(void)
{
        if(USART_GetITStatus(USART1,USART_IT_RXNE))
        {//如果收到数据
               
                LED1=!LED1;
                *rebuff=USART_ReceiveData( USART1);//读数据
//                USART_ClearFlag(USART1,  USART_IT_RXNE);
               
    i++;
        if(i==9)
        {
                LED0=!LED0;
                i=0;
                sign=1;
        }
}
}

int main(void)
{        
         LED0=1;
         LED1=1;
        delay_init();                     //延时函数初始化        
        NVIC_Configuration();// 设置中断优先级分组
        uart_init(9600);         //串口初始化为9600
        LED_Init();                           //初始化与LED连接的硬件接口
  LCD_Init();
//        
        USART_SendData( USART1,0xA5);//配置模块的波特率
         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送完毕
         USART_SendData( USART1,0xAE);
         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送完毕
         USART_SendData( USART1,0x53);
         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送完毕
         
         USART_SendData( USART1,0xA5);//上电输出
         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送完毕
         USART_SendData( USART1,0x51);
         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送完毕
         USART_SendData( USART1,0xF6);
         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送完毕
         
         USART_SendData( USART1,0xA5);//连续输出
         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送完毕
         USART_SendData( USART1,0x45);
         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送完毕
         USART_SendData( USART1,0xEA);
         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送完毕
        
        while(1)
        {
//                        LCD_Clear(YELLOW);
                POINT_COLOR=RED;
                LCD_ShowString(10,10,200,24,24,"jiayou");
                if(sign)//如果存完8字节
                {
        
                  LCD_ShowString(30,40,200,24,24,rebuff[0]);
                        LCD_ShowString(30,70,200,24,24,rebuff[1]);
                        LCD_ShowString(30,90,200,24,24,rebuff[2]);
                        LCD_ShowString(30,110,200,24,24,rebuff[3]);
                        LCD_ShowString(30,130,200,24,24,rebuff[4]);
                        LCD_ShowString(30,150,200,24,24,rebuff[5]);
                        LCD_ShowString(30,170,200,24,24,rebuff[6]);
                        LCD_ShowString(30,190,200,24,24,rebuff[7]);
                        LCD_ShowString(30,210,200,24,24,rebuff[8]);
                }
        }         
}


最佳答案

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

大眼一看各种问题,你还是先认真学习下吧 u8 *rebuff[9]; 为啥是指针[/backcolor] *rebuff=USART_ReceiveData( USART1);//读数据 地址不增加 // USART_ClearFlag(USART1, USART_IT_RXNE); 为何注释掉 sign=1; 为何主函数不清零 为何*rebuff=USART_ReceiveData( USART1);//读数据 不判断sign=0 这样收的快的话,还没显示就容易覆盖了 LCD_ShowString(30,40,200,24,24,rebuff[0] ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-12-15 23:00:31 | 显示全部楼层
本帖最后由 nashui_sx 于 2018-12-16 13:37 编辑

大眼一看各种问题,你还是先认真学习下吧  
u8 *rebuff[9];  为啥是指针
*rebuff=USART_ReceiveData( USART1);//读数据            地址不增加

//                USART_ClearFlag(USART1,  USART_IT_RXNE);  为何注释掉

sign=1;  为何主函数不清零  

为何*rebuff=USART_ReceiveData( USART1);//读数据  不判断sign=0  这样收的快的话,还没显示就容易覆盖了

LCD_ShowString(30,40,200,24,24,rebuff[0]);  既然说数据是16进制,你没说是不是16进制字符串 不是的话这样显示不对


。。。。。。
不要闭门造车,多看看别人代码,吸收下精华

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-16 02:07:15 | 显示全部楼层
仿真找问题
回复

使用道具 举报

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2018-9-16
在线时间
28 小时
 楼主| 发表于 2018-12-16 11:39:20 | 显示全部楼层

怎么仿真,想51一样画仿真图吗?32可以画仿真图吗?用什么软件?
回复

使用道具 举报

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2018-9-16
在线时间
28 小时
 楼主| 发表于 2018-12-16 13:31:44 | 显示全部楼层

原子大哥,我感觉我的指令模块可能收到的数据有错,也就是并不是我发送的指令,模块自然也无法返回温度数据,于是我首先检查我发的指令模块能收到,于是我按照上面的程序把数据发送给电脑,分别把      USART_SendData( USART1,0xA5);//配置模块的波特率这些指令放到while大循环中,串口助手显示的数据为
00   A5 AE 53 A5 51 F6 A5 45 EA
A5 AE 53 A5 51 F6 A5 45 EA
A5 AE 53 A5 51 F6 A5 45 EA
请问这个00是怎么回事,我并没有发送0x00
放在while(1)循环外面:
20 4C 43 44 20 49 44 3A 39 33 34 31 0D 0A
A5 AE 53 A5 51 F6 A5 45 EA
这里的20 4C 43 44 20 49 44 3A 39 33 34 31 0D 0A 又是从哪儿来的?我并未发送这些
那么我该如何检测我发送的数据指令是不是正确收到了呢?
因为在串口终端中我检测的是模块返回给我的指令
     
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-12-16 13:39:24 | 显示全部楼层
本帖最后由 nashui_sx 于 2018-12-16 13:42 编辑
执念之年 发表于 2018-12-16 13:31
原子大哥,我感觉我的指令模块可能收到的数据有错,也就是并不是我发送的指令,模块自然也无法返回温度数 ...

20 4C 43 44 20 49 44 3A 39 33 34 31 0D 0A是   LCD ID:9341
你还是先普及下知识吧

怎么检测发的指令对不对,发给串口助手看一下就知道了呀
回复

使用道具 举报

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2018-9-16
在线时间
28 小时
 楼主| 发表于 2018-12-16 15:41:04 | 显示全部楼层
nashui_sx 发表于 2018-12-16 13:39
20 4C 43 44 20 49 44 3A 39 33 34 31 0D 0A是   LCD ID:9341
你还是先普及下知识吧

我就是发送给电脑的串口助手了,那00   A5 AE 53 A5 51 F6 A5 45 EA中的00是什么意思呢?
回复

使用道具 举报

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2018-9-16
在线时间
28 小时
 楼主| 发表于 2018-12-16 15:42:35 | 显示全部楼层
nashui_sx 发表于 2018-12-16 13:39
20 4C 43 44 20 49 44 3A 39 33 34 31 0D 0A是   LCD ID:9341
你还是先普及下知识吧

况且我也没有读lcd:id呀,为何给我打印这个
回复

使用道具 举报

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2018-9-16
在线时间
28 小时
 楼主| 发表于 2018-12-16 18:08:44 | 显示全部楼层
nashui_sx 发表于 2018-12-16 13:35
大眼一看各种问题,你还是先认真学习下吧  
u8 *rebuff[9];  为啥是指针
*rebuff=USART_Rece ...

按照你的点拨,改成这样还是没显示,
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
int rebuff[9];
char sign=0;
int i=0;
void USART1_IRQHandler(void)
{
        if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
        {
                //如果收到数据
                if(!sign)
                {
                rebuff=USART_ReceiveData( USART1);//读数据
                }
                USART_ClearFlag(USART1,  USART_IT_RXNE);
//                if(rebuff[0]==0x5A)
//                {
//    i++;
//                                LED1=!LED1;
//                }
//   if(rebuff[1]!=0x5A)
           i++;
        if(i==9)
        {
                        sign=1;
                LED0=!LED0;
                i=0;
        }
}
}
int main(void)
{       
        LED0=1;
        LED1=1;
         sign=0;
        delay_init();                     //延时函数初始化       
        NVIC_Configuration();// 设置中断优先级分组
        uart_init(9600);         //串口初始化为9600
        LED_Init();                           //初始化与LED连接的硬件接口
        LCD_Init();
        USART_SendData( USART1,0xA5);//配置模块的波特率9600
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完毕
USART_SendData( USART1,0xAE);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完毕
USART_SendData( USART1,0x53);
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完毕

USART_SendData( USART1,0xA5);//上电输出
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完毕?
USART_SendData( USART1,0x52);
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完毕
USART_SendData( USART1,0xF7);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完毕
        while(1)
        {
                POINT_COLOR=RED;
                LCD_ShowString(10,10,200,24,24,"jiayou");
                 USART_SendData( USART1,0xA5);//连续输出
                 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完毕
                 USART_SendData( USART1,0x45);
          while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完毕
         USART_SendData( USART1,0xEA);
         while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完毕
             LCD_ShowxNum(30,250,rebuff[4]/16,200,24,0);                                //显示 数字
                 LCD_ShowxNum(130,280,rebuff[3]/16,200,24,0);                                //显示 数字
    }
}
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-12-16 19:44:24 | 显示全部楼层
本帖最后由 nashui_sx 于 2018-12-16 19:46 编辑
执念之年 发表于 2018-12-16 15:42
况且我也没有读lcd:id呀,为何给我打印这个

LCD_Init(); 里面有printf,你自己看看
rebuff=USART_ReceiveData( USART1);//读数据  你的地址也没增加呀
回复

使用道具 举报

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2018-9-16
在线时间
28 小时
 楼主| 发表于 2018-12-16 22:36:50 | 显示全部楼层
nashui_sx 发表于 2018-12-16 19:44
LCD_Init(); 里面有printf,你自己看看
rebuff=USART_ReceiveData( USART1);//读数据  你的 ...

粘贴错了
rebuff=USART_ReceiveData( USART1);
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 19:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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