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

2019-07-21 06:46发布

模块的功能:该模块为串口输出数据,使用者通过串口连接后,发送输出指令,例如 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]);
                }
        }         
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
nashui_sx
1楼-- · 2019-07-21 11:35
本帖最后由 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进制字符串 不是的话这样显示不对


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

正点原子
2楼-- · 2019-07-21 14:15
 精彩回答 2  元偷偷看……
执念之年
3楼-- · 2019-07-21 18:18
正点原子 发表于 2018-12-16 02:07
仿真找问题

怎么仿真,想51一样画仿真图吗?32可以画仿真图吗?用什么软件?
执念之年
4楼-- · 2019-07-21 19:13
正点原子 发表于 2018-12-16 02:07
仿真找问题

原子大哥,我感觉我的指令模块可能收到的数据有错,也就是并不是我发送的指令,模块自然也无法返回温度数据,于是我首先检查我发的指令模块能收到,于是我按照上面的程序把数据发送给电脑,分别把      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 又是从哪儿来的?我并未发送这些
那么我该如何检测我发送的数据指令是不是正确收到了呢?
因为在串口终端中我检测的是模块返回给我的指令
     
nashui_sx
5楼-- · 2019-07-22 01:11
本帖最后由 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
你还是先普及下知识吧

怎么检测发的指令对不对,发给串口助手看一下就知道了呀
执念之年
6楼-- · 2019-07-22 01:50
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是什么意思呢?

一周热门 更多>