这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【已解决】串口问题,超级终端收不到数据

共11条 1/2 1 2 跳转至

【已解决】串口问题,超级终端收不到数据

菜鸟
2014-04-20 00:54:11     打赏

首先上我的代码:

GPIO:


void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure USARTx_Tx as alternate function push-pull */
  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);

  /* Configure USARTx_Rx as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}


NVIC:


void NVIC_Configuration(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQChannel;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=15;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}


中断响应程序


void USART1_IRQHandler(void)
{
	while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET)
	{}
	USART_SendData(USART1,USART_ReceiveData(USART1));
	USART_ClearFlag(USART1,USART_FLAG_RXNE);
}


RCC


void RCC_Configuration(void)
{

  /* Enable GPIOx clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  /* Enable USARTx clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

}


main



int main(void)
{
#ifdef DEBUG
  debug();
#endif
  	/* System Clocks Configuration */
  	RCC_Configuration();
  	/* NVIC configuration */
  	NVIC_Configuration();
  	/* Configure the GPIO ports */
 	GPIO_Configuration();
	USART_InitStructure.USART_BaudRate=115200;
	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_Cmd(USART1,ENABLE);
    while (1)
    {
		printf("\n\rUSART Printf Example: retarget the C library printf function 

to the USART\n\r");
		Delay(100000);
    }
} 


我试了两种波特率(2400,115200)都不行,我使用的是usb转串口线+超级终端,板子上的连接情况如下图:


超级终端配置如下,收不到任何信息,求大神帮忙啊,搞了几天了:




----------------------------------------------------------------------------------------------------------------------

问题出现在两个地方:pringtf函数和线的连接

使用printf函数要重新定义fputc函数,printf会回调这个函数(放在main.c中就可以),注意这个函数要设置UART端口


fputc(int ch, FILE *f)
{
  /* Write a character to the USART */
  USART_SendData(USART1, (u8) ch);

  /* Loop until the end of transmission */
  while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == SET))
  {
  }

  return ch;
}



第二个问题是,TX和RX接反了,电脑的RX要接板子的TX,我接反了,真是惭愧,判断电脑上RX和TX的方法:RX的点压比TX低,usb转串口有四根线,电压关系:GND


高工
2014-04-20 01:19:12     打赏
2楼

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE );这一句好像没有


楼主可以先在主函数里,单独测试一下发送,不用printf函数,就利用


void  UART1_SendChar(u8 dat)
{
	USART_SendData (USART1,dat);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);		
}

void  UART1_SendString(u8 *p)
{
	while(*p != '\0')
	{
		UART1_SendChar(*p);
		p++;	
	}
}




院士
2014-04-20 09:48:39     打赏
3楼

楼主 注意一下,

烈火的板子使用的是16MHz的晶振,而非demo里的8MHz晶振,如果没有重新配置时钟,这里的串口是无法通讯的。


高工
2014-04-20 17:08:39     打赏
4楼
楼主,如果我没有记错的的,USB转串口之后,还需要增加232转换,楼主增加了吗

菜鸟
2014-04-20 18:26:58     打赏
5楼
怎么转换,我是直接把usb转串口线拆了,接线出来的

菜鸟
2014-04-20 18:27:48     打赏
6楼
我用的手柄调试的,手柄上是8M的

菜鸟
2014-04-20 18:28:29     打赏
7楼
还是没用,

院士
2014-04-20 19:45:56     打赏
8楼

楼主的问题已经不是这几行代码了。

这几行代码是没有问题的,包括引脚的初始化,串口的初始化


楼主从其它方面找原因吧,例如硬件上是否USB转串口正常?

手柄上的芯片的时钟是否正常初始化了,等等


院士
2014-04-20 19:47:37     打赏
9楼
另 楼主您原来的printf函数是不需要打开中断的,理论上,正确配置了串口及包含了printf函数库后,就能发送数据到上位机。

助工
2014-04-20 21:47:05     打赏
10楼

keil要打个勾的,去我那里看看


共11条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]