OpenEdv-开源电子网

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

急,求帮助

[复制链接]

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-6-4
在线时间
0 小时
发表于 2013-6-4 23:05:44 | 显示全部楼层 |阅读模式
每次有键按下,通过串口发送到PC机上,如KEY1按下,则发送“KEY1.”,并换行。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
886
金钱
886
注册时间
2011-12-25
在线时间
12 小时
发表于 2013-6-4 23:09:09 | 显示全部楼层
把原子哥的key程序改一下就行。跟点灯一样。
很喜爱电子行业
回复 支持 反对

使用道具 举报

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2010-12-14
在线时间
5 小时
发表于 2013-6-4 23:12:23 | 显示全部楼层
printf打印呗,之后\n换行,并把传递的参数放入到printf里。
回复 支持 反对

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-6-4
在线时间
0 小时
 楼主| 发表于 2013-6-4 23:19:18 | 显示全部楼层
回复【3楼】shilang0304:
---------------------------------
t=KEY_Scan();
if(t==1)
printf("\nKEY1\n");
printf("\n\n");
回复 支持 反对

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-6-4
在线时间
0 小时
 楼主| 发表于 2013-6-4 23:26:43 | 显示全部楼层
回复【3楼】shilang0304:
---------------------------------
回复【2楼】冰是睡着的水:
---------------------------------
水平很低,没改成功。目的实现不了
回复 支持 反对

使用道具 举报

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2010-12-14
在线时间
5 小时
发表于 2013-6-4 23:45:32 | 显示全部楼层
比较笨的方法是你先判断出是哪个键盘按下
switch(key_scan())
{
      case:0x01:
          printf("KEY1\r\n");打印出KEY1
      case:0x02:
          printf("KEY2\r\n");打印出KEY2
//以此类推打印出对应的按下值
}
回复 支持 反对

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-6-4
在线时间
0 小时
 楼主| 发表于 2013-6-5 07:17:19 | 显示全部楼层
回复【6楼】shilang0304:
---------------------------------
我刚刚按你说的试了一下,按键按下后,串口调试助手里什么都不显示
回复 支持 反对

使用道具 举报

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2010-12-14
在线时间
5 小时
发表于 2013-6-5 09:06:50 | 显示全部楼层
首先你需要确定你的串口函数时候正确,是否能进行正常的接受和发送。
第二你确定你的大隐函数是否争取。再论坛中我回复过如何加入打印函数。
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-6-5 09:36:27 | 显示全部楼层
楼上的哪位大侠直接给代码吧,呵呵。
业余程序玩家。
回复 支持 反对

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-6-4
在线时间
0 小时
 楼主| 发表于 2013-6-5 11:51:30 | 显示全部楼层
回复【8楼】shilang0304:
---------------------------------
int main(void)
{
u8 t;
u8 len;
int a=1;
int b=1;
u16 times=0;  
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);      //延时初始化 
uart_init(72,9600);  //串口初始化为9600
LED_Init();     //初始化与LED连接的硬件接口 
KEY_Init();          //初始化与按键连接的硬件接口   
while(1)
{
t=KEY_Scan();
// switch(t) 
// { 
//       case 1:
//           printf("KEY1\r\n");//打印出KEY1 
//       case 2:
//           printf("KEY2\r\n");//打印出KEY2 
// }
if(USART_RX_STA&0x80)
{    
len=USART_RX_STA&0x3f;//得到此次接收到的数据长度
printf("\n您发送的消息为:\n");
printf("\nKEY1\n");
for(t=0;t<len;t++)
{
USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//等待发送结束
}
printf("\n\n");//插入换行
USART_RX_STA=0;
}else
{
times++;
if(times%5000==0)
{
printf("\nMiniSTM32开发板 串口实验\n");
printf("正点原子@ALIENTEK\n\n\n");
}
if(times%200==0)printf("请输入数据,以回车键结束\n");  
if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
delay_ms(10);   
}
回复 支持 反对

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2013-6-5 11:54:20 | 显示全部楼层
首先跑例程,确保printf没有问题。
然后修改。
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复 支持 反对

使用道具 举报

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2010-12-14
在线时间
5 小时
发表于 2013-6-5 12:00:56 | 显示全部楼层
你先用软件仿真,跑一下这个代码,打印窗口是否能打印出OK
如果能打印出OK,剩下的就只能你自己解决了,我现在手里没有板子。

#include "stm32f10x.h"
#include<stdio.h>
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 

int handle; 

}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
_sys_exit(int x) 

x = x; 

//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
return ch;
}
#endif 

void uart_init()
{
    
    GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO的结构体名称
USART_InitTypeDef USART_InitStructure;  //定义UART的结构体名称
NVIC_InitTypeDef NVIC_InitStructure; //定义NVIC的结构体名称

/*  使能USART1的时钟和GPIO的时钟(串口的发送PA9\接收用的是PA10)*/  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);

/*  对GPIO进行初始化,包括GPIO的引脚、速度和工作模式*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);    

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);  


/*  对NVIC进行初始化,包括入口、优先级、以及使能中断*/
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //设置中断入口
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级为2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //抢占子优先级为2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1
  
/*  对USART进行初始化,包括波特率、字长、停止位、奇偶校验位、*/
   
USART_InitStructure.USART_BaudRate = 9600; //一般设置为9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位为8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //没有校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控模式
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //串口工作在收发模式

    USART_Init(USART1, &USART_InitStructure);
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
    USART_Cmd(USART1, ENABLE);                    //使能串口 
}

/*void USART1_IRQHandler(void)                   //串口1中断服务程序
{
unsigned char Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
 Res =USART_ReceiveData(USART1);//(USART1->DR);    //读取接收到的数据  
 USART_SendData(USART1, Res);
 //printf("OK\n");

}
}  */


int main()
{
 uart_init();
 while(1)
 {
   printf("OK\n");
 }
 
}
回复 支持 反对

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-6-4
在线时间
0 小时
 楼主| 发表于 2013-6-5 12:28:31 | 显示全部楼层
回复【12楼】shilang0304:
---------------------------------
我的那段代码,为什么printf放在if里面就可以,不在if里面就不能显示呢?
回复 支持 反对

使用道具 举报

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2010-12-14
在线时间
5 小时
发表于 2013-6-5 12:39:35 | 显示全部楼层
不太明吧你的意思,你好好看看原子给的例程,那里面是有协议的。
回复 支持 反对

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-6-4
在线时间
0 小时
 楼主| 发表于 2013-6-5 12:42:28 | 显示全部楼层
回复【14楼】shilang0304:
---------------------------------
if(USART_RX_STA&0x80) 
{      
len=USART_RX_STA&0x3f;//得到此次接收到的数据长度 
printf("\n您发送的消息为:\n"); 
printf("\nKEY1\n"); 
for(t=0;t<len;t++) 

USART1->DR=USART_RX_BUF[t]; 
while((USART1->SR&0X40)==0);//等待发送结束 

printf("\n\n");//插入换行 
USART_RX_STA=0; 
}
这个if里面的printf都可以的,但是不在这个if里面的printf就不行了,为什么啊?
回复 支持 反对

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-6-4
在线时间
0 小时
 楼主| 发表于 2013-6-5 12:52:53 | 显示全部楼层
回复【11楼】Admin:
---------------------------------
不太会,哎~
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-19 02:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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