OpenEdv-开源电子网

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

串口问题,串口1接收,串口2发送

[复制链接]

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-8-26
在线时间
11 小时
发表于 2015-10-26 12:13:38 | 显示全部楼层 |阅读模式
5金钱
串口1接收,串口2发送,怎么调PC都收不到数据.求大神们帮我看看代码,哪里有错!!!

串口一初始代码
//////////////////////////////////////////////////////////////////////////////////  
#include "sys.h"
#include "usart.h"  
//////////////////////////////////////////////////////////////////////////////////  
#if SYSTEM_SUPPORT_UCOS
#include "includes.h" 
#endif
//////////////////////////////////////////////////////////////////////////////////  
#if 1
#pragma import(__use_no_semihosting)                  
struct __FILE 

int handle; 
}; 
FILE __stdout;       
_sys_exit(int x) 

x = x; 

int fputc(int ch, FILE *f)
{      
while((USART1->SR&0X40)==0);
    USART1->DR = (u8) ch;      
return ch;
}
#endif 
u8 USART_RX_BUF[USART_REC_LEN]; 
u16 USART_RX_STA=0;       //????×???±ê??  
void uart_init(u32 bound){
    GPIO_InitTypeDef GPIO_InitStructure;
 USART_InitTypeDef USART_InitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); 
   USART_DeInit(USART1); 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //
    GPIO_Init(GPIOA, &GPIO_InitStructure); //??????PA9
   
    //USART1_RX  A.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure); 

   //Usart1 NVIC 

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; 
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
 NVIC_Init(&NVIC_InitStructure); 
 

USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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);

}
#if EN_USART1_RX
void USART1_IRQHandler(void)
{
u8 Res;
#ifdef OS_TICKS_PER_SEC
OSIntEnter();    
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) 
{
Res =USART_ReceiveData(USART1);//(USART1->DR);

if((USART_RX_STA&0x8000)==0)
{
if(USART_RX_STA&0x4000)
{
if(Res!=0x0a)USART_RX_STA=0;
else USART_RX_STA|=0x8000; 
}
else 
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
}  
}
}    
     } 
#ifdef OS_TICKS_PER_SEC
OSIntExit();    
#endif

#endif
串口二初始代码
//////////////////////////////////////////////////////////////////////////////////  
#include "sys.h"
#include "usart2.h"  
//////////////////////////////////////////////////////////////////////////////////  

#if SYSTEM_SUPPORT_UCOS
#include "includes.h" 
#endif
//////////////////////////////////////////////////////////////////

#if 1
#pragma import(__use_no_semihosting)             
   
struct __FILE 

int handle; 

}; 

FILE __stdout2;       

_sys_exit2(int x) 

x = x; 


int fputc2(int ch, FILE *f)
{      
while((USART2->SR&0X40)==0);
    USART2->DR = (u8) ch;      
return ch;
}
#endif 



u8 USART2_RX_BUF[USART_REC_LEN]; 

u16 USART2_RX_STA=0;

void uart2_init(u32 bound){

    GPIO_InitTypeDef GPIO_InitStructure;
 USART_InitTypeDef USART_InitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_GPIOA, ENABLE); 
   USART_DeInit(USART1); 
//USART1_TX   PA.2
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
    GPIO_Init(GPIOA, &GPIO_InitStructure); 
   
    //USART1_RX  A.3
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure); 


    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; 
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure); 
  


USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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(USART2, &USART_InitStructure);
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
    USART_Cmd(USART2, ENABLE);                   

}
#if EN_USART2_RX 
void USART2_IRQHandler(void)  
{
u8 Res;
#ifdef OS_TICKS_PER_SEC 
OSIntEnter();    
#endif
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  
{
Res =USART_ReceiveData(USART2);//(USART1->DR);

if((USART2_RX_STA&0x8000)==0)
{
if(USART2_RX_STA&0x4000)
{
if(Res!=0x0a)USART2_RX_STA=0;
else USART2_RX_STA|=0x8000;
}
else 
{
if(Res==0x0d)USART2_RX_STA|=0x4000;
else
{
USART2_RX_BUF[USART2_RX_STA&0X3FFF]=Res ;
USART2_RX_STA++;
if(USART2_RX_STA>(USART_REC_LEN-1))USART2_RX_STA=0;
}  
}
}    
     } 
#ifdef OS_TICKS_PER_SEC
OSIntExit();    
#endif

#endif

主函数
//////////////////////////////////////////////////////////////////////////////////  
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "usart2.h"

 int main(void)
 {
u8 t;
u8 len;
 
delay_init(); 
NVIC_Configuration();
uart_init(9600); 
uart2_init(9600);
 
while(1)
{
  while(1) 

if(USART_RX_STA&0x8000) 
{    
len=USART_RX_STA&0x3FFF;
for(t=0;t<len;t++) 

USART2->DR=USART_RX_BUF[t]; 
while((USART2->SR&0X40)==0);
}  
USART_RX_STA=0; 
}else 
{  






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

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2015-10-26 17:01:53 | 显示全部楼层
回复

使用道具 举报

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-8-26
在线时间
11 小时
 楼主| 发表于 2015-10-26 19:08:14 | 显示全部楼层
回复【2楼】Rocks:
---------------------------------
  while(1) 

if(USART_RX_STA&0x8000) 
{    
len=USART_RX_STA&0x3FFF;
for(t=0;t<len;t++) 

USART2->DR=USART_RX_BUF[t]; 
while((USART2->SR&0X40)==0);
}  
USART_RX_STA=0; 
}
回复

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2015-10-27 10:47:10 | 显示全部楼层
原廠是去判斷TXE 發送下一字節
TC是資料串都結束時再去等待

另外 USART_RX_BUF 這樣用真的沒問題嗎
亂搞阿
你說有發送但是完全沒有填資料進去
你怎麼確定你收到的是你要的?

如果你愛用暫存器版的 麻煩註解一下

(USART2->SR&0X40) 這是判斷哪一位你知道
但看的人哪知道= =
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 17:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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