各位大神,帮忙看看; 在main里面,串口循环输出,22,可以输从串口助手这边,只看到7个22就没有,需要断电再连续,然后发送7个或者8个22又没有,为什么不能重复发送呢?仿真发现停在LDR R0,=SystemInit,已经尝试去掉所以断点,也扩大了Stack_Size EQU 0x00000800。 小白请大神帮忙,谢谢~ while(1) { USART_SendData(USART2,0x22); USART_ClearFlag(USART2,USART_FLAG_TXE); Delay_ms(100); } 图片里面的 USART_ClearFlag(USART1,USART_FLAG_TXE);还没有改成USART2,请忽略这个。 |
那需要怎么改?
我之前是用printf 打印输出,结果发现发送一会就没有数据发送了,所以我就尝试直接输出22,看看情况,这个是之前的代码:
while(1)
{
for(i=0;i<3;i++)
{
LED_ON;
Delay_ms(5);
ADval=Get_ADValue();
// printf("OD:%.3f \r\n",ADval*3.3/4096);
printf("OD:%.3f \r\n",ADval);
}
// ADval/=10;
for(i=0;i<3;i++)
{
LED_OFF;
Delay_ms(5);
ADval=Get_ADValue();
// printf("OD:%.3f \r\n",ADval*3.3/4096);
printf("OD:%.3f \r\n",ADval);
}
// ADval/=10;
}
int fputc(int ch, FILE *f)
{
DEBUG_USARTx->SR;
USART_SendData(DEBUG_USARTx, (uint8_t) ch);
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
return (ch);
}
我帮不了您,解决以后请告诉大家您怎么解决的。
void USART_Config(void)
{ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure;
DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
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(DEBUG_USARTx, &USART_InitStructure);
NVIC_Configuration();
USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);
USART_Cmd(DEBUG_USARTx, ENABLE);
USART_ClearFlag(USART1, USART_FLAG_TC);
}
/// 重定向C库函数printf到USART2
int fputc(int ch, FILE *f)
{
DEBUG_USARTx->SR;
USART_SendData(DEBUG_USARTx, (uint8_t) ch);
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE)== RESET);
return (ch);
}
int main ( void )
{
int i=0;
float ADval=0;
USART_Config ();
SysTick_Init ();
AdcInit();
Set_Adc(ADC_Channel_6);
LED_ON;
Delay_ms(10);
while(1)
{
for(i=0;i<3;i++)
{
LED_ON;
Delay_ms(5);
ADval=Get_ADValue();
// printf("OD:%.3f \r\n",ADval*3.3/4096);
printf("OD:%.3f \r\n",ADval);
}
for(i=0;i<3;i++)
{
LED_OFF;
Delay_ms(5);
ADval=Get_ADValue();
// printf("OD:%.3f \r\n",ADval*3.3/4096);
printf("OD:%.3f \r\n",ADval);
}
}
目前串口调试助手上可以正确显示,但是只有很短的一段时间,需要断电后,重新连接,再发送一部分。我希望是可以一直发送数据。也是刚接触这个编程不久,看了不少的帖子,还有例子,还是弄的不是很清楚。
你试试用这个判断标记吧,不行就没有办法了
我试着改了一下,还是没有用。
我尝试吧波特率改了一下,接收数据多一些,都没有传完整就停了,感觉像是设定的时间到了一样,不知道该从哪里去找
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
USART_SendData(USART2,22);
你应该这样写就对了
评分
查看全部评分
改成这个,串口助手直接什么都不显示了
while( USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET );
USART_SendData(USART2,22);
评分
查看全部评分
2、while应该放在前面,等待串口上的数据发送完毕,再发下一帧数据
改成这个
while( USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET );
USART_SendData(USART2,22);
串口没有显示了
我改成printf输出:
int main(void)
{
USART_Config();
while(1)
{
printf( "22 \n");
printf( "33 \n");
}
}
其他相关配置:
UART相关的配置:
void USART_Config(void)
{ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure;
DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
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(DEBUG_USARTx, &USART_InitStructure);
NVIC_Configuration();
USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);
USART_Cmd(DEBUG_USARTx, ENABLE);
USART_ClearFlag(USART1, USART_FLAG_TC);
}
/// 重定向C库函数printf到USART2
int fputc(int ch, FILE *f)
{
DEBUG_USARTx->SR;
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE)== RESET);
USART_SendData(DEBUG_USARTx, (uint8_t) ch);
return (ch);
}
串口助手可以正常显示一部分后乱码,然后就没有数据传输,需要重新断电后,传输部分数据,乱码,...