新手入门
- 积分
- 16
- 金钱
- 16
- 注册时间
- 2019-5-8
- 在线时间
- 5 小时
|
5金钱
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "exti.h"
//ALIENTEK 探索者STM32F407开发板 实验4
//串口通信实验 -库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com
//广州市星翼电子科技有限公司
//作者:正点原子 @ALIENTEK
#define Datanumber 12
int Optime[12][2];
int main(void)
{
u8 t;
u8 len;
u16 times=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //延时初始化
uart_init(115200); //串口初始化波特率为115200
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化与按键连接的硬件接口
LCD_Init();
POINT_COLOR=RED;
LED0=0; //先点亮红灯
EXTIX_Init(); //初始化外部中断输入
int Data[12];
int number=0;
int length=0;
int thousand;
int hundred;
int ten;
int one;
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
printf("您发送的消息为:\r\n");
for(t=0;t<len;t++)
{
if(USART_RX_BUF[t]!='/')
{
if(number!=0)
{
length++;
}
}
else
{
if(number!=0)
{
if(length==4)
{
thousand=USART_RX_BUF[t-4]-48;
hundred=USART_RX_BUF[t-3]-48;
ten=USART_RX_BUF[t-2]-48;
one=USART_RX_BUF[t-1]-48;
Data[number]=1000*thousand+100*hundred+10*ten+one;
}
else if(length==3)
{
hundred=USART_RX_BUF[t-3]-48;
ten=USART_RX_BUF[t-2]-48;
one=USART_RX_BUF[t-1]-48;
Data[number]=100*hundred+10*ten+one;
}
else if(length==2)
{
ten=USART_RX_BUF[t-2]-48;
one=USART_RX_BUF[t-1]-48;
Data[number]=10*ten+one;
}
else if(length==2)
{
one=USART_RX_BUF[t-1]-48;
Data[number]=one;
}
printf("%d:%d",number,Data[number]);
}
else
{
for(int t1=0;t1<8;t1++)
printf("%c",USART_RX_BUF[t1]);
}
length=0;
number ++;
printf("\r\n");//插入换行
}
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
printf("\r\n");//插入换行
USART_RX_STA=0;
number=0;
for(int k=0;k<13;k++)
{
Optime[k][0]=Data[k];
Optime[k][1]=k;
}
int i,j,t,c; //定义变量及数组为基本整型
for(i=1;i<12;i++) //变量i代表比较的趟数
for(j=1;j<13-i;j++) //变最j代表每趟两两比较的次数
if(Optime[j][0]>Optime[j+1][0])
{
t=Optime[j][0]; //产利用中间变童实现两值互换
Optime[j][0]=Optime[j+1][0];
Optime[j+1][0]=t;
c=Optime[j][1];
Optime[j][1]=Optime[j+1][1];
Optime[j+1][1]=c;
}
printf("排序后的顺序是:\r\n");
for(i=1;i<=12;i++)
printf("%d:%d\r\n",Optime[1],Optime[0]); //将胃泡排序后的顺序输出
printf("\n");
}
else
{
times++;
if(times%1000==0)printf("请输入数据,以回车键结束\r\n");
delay_ms(10);
}
if(KEY1==0)
{
u8 str[20];
sprintf((char*)str,"%d",Optime[1][0]);
POINT_COLOR=RED;
printf("%s",str);
LCD_ShowString(30,40,210,24,24,str);
}
}
}
上面为程序,是通过USART1从电脑向STM32F4探索者发送一个例如300/400/500....的数据,然后在STM32中对数据进行排序,并将排序后的数据和排序之前的数据输出到串口。
现在想同时加上在LCD中显示数据的功能
if(KEY1==0)
{
u8 str[20];
sprintf((char*)str,"%d",Optime[1][0]);
POINT_COLOR=RED;
printf("%s",str);
LCD_ShowString(30,40,210,24,24,str);
}
用这几行代码在试验的过程中发现,如果在不用串口发数据的时候,按下KEY1正常可以在LCD中显示0,如果先将数据发送后再按下KEY1正常应该显示Opentime[1][0]的值,可是却什么都不显示,是USART1还在被占用所以无法将结果输出到LCD吗,搞不太明白了,非常感谢大家
|
最佳答案
查看完整内容[请看2#楼]
参考下这个代码吧:http://www.openedv.com/forum.php?mod=viewthread&tid=293434
|