STM32 串口不能循环输出问题
各位大神,帮忙看看;在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,请忽略这个。
发送函数调用之后,一般是要等待发送完成标记被置起才能发送下一个字节的,你现在这样是直接清除了标记,不妥 有没有字节没发送完成就被清了
tgw860910 发表于 2019-12-19 11:39
发送函数调用之后,一般是要等待发送完成标记被置起才能发送下一个字节的,你现在这样是直接清除了标记,不 ...
那需要怎么改?
我之前是用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);
} 用HAL库,没有这样的细节不大不小的问题。
我帮不了您,解决以后请告诉大家您怎么解决的。 我也有点晕了,其实就是需要从外部采集到电压信号,经过采集处理后,通过串口输出给上位机。现在是想用UART2去发送AD转换后的数据。只需要发送数据就可以了。下面是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;
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(DEBUG_USARTx, USART_FLAG_TC)== RESET);
你试试用这个判断标记吧,不行就没有办法了 tgw860910 发表于 2019-12-19 15:51
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TC)== RESET);
你试试用这个判断标记吧,不行 ...
我试着改了一下,还是没有用。
我尝试吧波特率改了一下,接收数据多一些,都没有传完整就停了,感觉像是设定的时间到了一样,不知道该从哪里去找:L 谁可以帮忙看看么?顶起 daisyduxy 发表于 2019-12-20 11:01
谁可以帮忙看看么?顶起
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
USART_SendData(USART2,22);
你应该这样写就对了
页:
[1]
2