OpenEdv-开源电子网

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

将“实验4 串口实验”改串口2始终不通过,求解

[复制链接]

10

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2013-12-6
在线时间
5 小时
发表于 2015-8-21 02:04:07 | 显示全部楼层 |阅读模式
5金钱
现在要用串口2挂一个传感器读数据,所以改写“实验4 串口实验” ,希望“本实验串口2将不停的打印信息到电脑上,同时接收从串口发过来的数据,把发送过来的数据直接送回给电脑。”现在信息可以打印到电脑上,但是输入的数据按回车串口始终未接收,检查了硬件连接,软件都没发现问题。陷入疑惑啊,搞到凌晨2点钟



//////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB  
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                
struct __FILE
{
 int handle;
 /* Whatever you require here. If the only file you are using is */
 /* standard output using printf() for debugging, no file handling */
 /* is required. */
};
/* FILE is typedef’ d in stdio.h. */
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;
 */
 while((USART2->SR&0X40)==0);//循环发送,直到发送完毕  
 USART2->DR = (u8) ch;     
 return ch;
}
#endif

#if EN_USART2_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误    
u8 USART2_RX_BUF[USART2_REC_LEN];     //接收缓冲,最大USART2_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数?
u16 USART2_RX_STA=0;       //接收状态标记


void USART2_IRQHandler(void)
{
 u8 res2; 
 if(USART2->SR&(1<<5))//接收到示?
 { 
  res2=USART2->DR;
  if((USART2_RX_STA&0x8000)==0)//接收未完成
  {
   if(USART2_RX_STA&0x4000)//接收到了0x0d
   {
    if(res2!=0x0a)USART2_RX_STA=0;//接收错误,重新开始
    else USART2_RX_STA|=0x8000; //接收完成了
   }else //还没收到0X0D
   { 
    if(res2==0x0d)USART2_RX_STA|=0x4000;
    else
    {
     USART2_RX_BUF[USART2_RX_STA&0X3FFF]=res2;
     USART2_RX_STA++;
     if(USART2_RX_STA>(USART2_REC_LEN-1))USART2_RX_STA=0;//接收数据错误,重新开始接收  
    }  
   }
  }                  
 }
}
#endif  
  

//初始化IO 串口2
//pclk1CLK1时钟频率(Mhz)
//bound:波特率
//CHECK OK
//091209
void uart2_init(u32 pclk1,u32 bound)
{   
 float temp;
 u16 mantissa;
 u16 fraction;   
 temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
 mantissa=temp;     //得到整数部分
 fraction=(temp-mantissa)*16; //得到小数部分 
    mantissa<<=4;
 mantissa+=fraction;
 RCC->APB2ENR|=1<<2;   //使能PORTA口时钟 
 RCC->APB1ENR|=1<<17;  //使能串口时钟
    GPIOA->CRL &= 0XFFFF00FF; //IO状态设置
    GPIOA->CRL |= 0X00008B00; //IO状态设置
   
 RCC->APB1RSTR|=1<<17;   //复位串口2
 RCC->APB1RSTR&=~(1<<17);//停止复位       
 //波特率设置
  USART2->BRR=mantissa; // 波特率设置 
 USART2->CR1|=0X200C;  //1位停止,无校验位.
#if EN_USART2_RX    //如果使能了接收
 //使能接收中断
 USART2->CR1|=1<<8;    //PE中断使能
 USART2->CR1|=1<<5;    //接收缓冲区非空中断使能      
 MY_NVIC_Init(3,3,USART2_IRQChannel,2);//组2,最低优先级
#endif
}

//ALIENTEK战舰STM32开发板实验4
//串口实验 
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
int main(void)
{   
 u16 t;
 u16 len; 
 u16 times=0;       
 Stm32_Clock_Init(9); //系统时钟设置
// uart1_init(72,9600);   //串口初始化为9600
 uart2_init(36,9600);   //串口初始化为9600
 delay_init(72);       //延时初始化
 LED_Init();      //初始化与LED连接的硬件接口
 BEEP_Init();          //初始化蜂鸣器端口
 KEY_Init();          //初始化与按键连接的硬件接口

 

  while(1)
 {
  if(USART2_RX_STA&0x8000)
  {       
   len=USART2_RX_STA&0x3FFF;//得到此次接收到的数据长度
   printf("\r\n您发送的消息为:\r\n\r\n");
   for(t=0;t<len;t++)
   {
    USART2->DR=USART2_RX_BUF[t];
    while((USART2->SR&0X40)==0);//等待发送结束
   }
   printf("\r\n\r\n");//插入换行
   USART2_RX_STA=0;
  }
  else
  {
   times++;
   if(times%5000==0)
   {
    printf("\r\n战舰STM32开发板 串口实验\r\n");
    printf("正点原子@ALIENTEK\r\n\r\n");
   }
   if(times%200==0)printf("请输入数据,以回车键结束\r\n"); 
   if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
   delay_ms(10);  
  }
 }
}



程序检查了很多次,没有问题,连线也检查了很多次没有问题,这还让人睡觉不?

串口通信.rar

256.53 KB, 下载次数: 56

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2013-12-6
在线时间
5 小时
 楼主| 发表于 2015-8-21 02:09:43 | 显示全部楼层
希望一大早到公司有朋友找到问题,做个好梦,睡了
回复

使用道具 举报

10

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2013-12-6
在线时间
5 小时
 楼主| 发表于 2015-8-21 08:45:10 | 显示全部楼层
不知道是哪出错了啊,第一个帮解决的5元支付宝红包送上啊
回复

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
发表于 2015-8-21 08:57:08 | 显示全部楼层
检查源头:加了\r\n 没,用示波器看电脑确实发送了数据
检查目的地:你的串口接收中断,是否可以用,用JTAG仿真,看能否进入接收中断,如果不能,说明你的电脑没有发送出来

最简单的办法:


else USART2_RX_STA|=0x8000; //接收完成了

代码处,加入断点,看能否走到这里。
回复

使用道具 举报

8

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2015-8-1
在线时间
7 小时
发表于 2015-8-21 08:57:12 | 显示全部楼层
原子那个代码需要 \r\n组合作为结束,你的外设按回车后是否发送了组合码,还是只发送了 \n
有软件开发经验,从0硬件基础学习STM32开发。
回复

使用道具 举报

10

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2013-12-6
在线时间
5 小时
 楼主| 发表于 2015-8-21 09:29:55 | 显示全部楼层
回复【5楼】dragon7799:
---------------------------------
每次都按回车了发送,串口收不到
回复

使用道具 举报

10

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2013-12-6
在线时间
5 小时
 楼主| 发表于 2015-8-21 09:44:19 | 显示全部楼层
回复【4楼】zhp:
---------------------------------
回复【5楼】dragon7799:
---------------------------------
电脑串口上可以显示
请输入数据,以回车键结束
请输入数据,以回车键结束
请输入数据,以回车键结束
说明电路板往电脑串口发送数据是正常的,现在是电脑这边发送数据时,串口2没有接收中断,程序你们可以下载看一下,我检查了很多次,发现不了问题
回复

使用道具 举报

10

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2013-12-6
在线时间
5 小时
 楼主| 发表于 2015-8-21 09:48:31 | 显示全部楼层
问题解决了,程序注释后面多了点什么,删除就好了
回复

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
发表于 2015-8-21 09:49:45 | 显示全部楼层
回复【7楼】小蚂蚁:
---------------------------------
从你说的描述来看,你的MCU的串口发送时正常的,接收有问题,那么从接收中断开始查,发送和接收是单独的

MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级 

MY_NVIC_Init(3,3,USART2_IRQChannel,2);//组2,最低优先级

该一下串口2的中断优先级,你把他们设置成一样的了

回复

使用道具 举报

20

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
639
金钱
639
注册时间
2014-6-20
在线时间
169 小时
发表于 2015-8-21 10:11:24 | 显示全部楼层
楼主你在逗大家的吧?你这个程序我刚才试过了 没问题,没问题,可以正常读写。你之所以读不出来我猜是因为你用原子的板子上的IO连接电脑的,而没用9pin转usb线连接电脑,那样是不行的。至于你在7楼说的注释原因,我一头雾水了,注释能有什么影响?
回复

使用道具 举报

10

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2013-12-6
在线时间
5 小时
 楼主| 发表于 2015-8-21 10:25:02 | 显示全部楼层
回复【10楼】Fliger:
---------------------------------
这个我还是很注意的,电脑是232电平,板子IO是TTL电平,看我的第一张图,连接是经过了232转换的,没有问题的,我今天试了就删了点注释后面的东西,怎么就好了,不过新问题又来了,我开个新帖
回复

使用道具 举报

20

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
639
金钱
639
注册时间
2014-6-20
在线时间
169 小时
发表于 2015-8-21 10:35:24 | 显示全部楼层
回复【11楼】小蚂蚁:
---------------------------------
那你不删试试,或者你把你删了之后的程序也发上来看看,我感觉你源程序就没问题。我有点钻牛角,请勿见怪。如果不方便发就算了。另:等新帖
回复

使用道具 举报

10

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2013-12-6
在线时间
5 小时
 楼主| 发表于 2015-8-21 11:03:27 | 显示全部楼层
回复【12楼】Fliger:
---------------------------------
回复【9楼】zhp:
---------------------------------
回复【5楼】dragon7799:
---------------------------------
新帖发了,最终目的是串口2只接传感器,串口1接电脑。传感器数据给串口2,通过串口1显示出来,还差一点点就成功了。希望大家一起讨论!!
回复

使用道具 举报

22

主题

213

帖子

0

精华

高级会员

Rank: 4

积分
682
金钱
682
注册时间
2015-2-13
在线时间
74 小时
发表于 2015-8-21 14:07:30 | 显示全部楼层
4楼正解。 你改下接收协议就行了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 07:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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