我用stm8s103f3做串口的数据收发,数据发送正常,但是数据接收不管是中断方式还是轮训方式都无法接收数据串,只能收到每次数据串的第一个字节,下面是我的程序:[mw_shl_code=c,true]static volatile char rx;
static volatile bool new_rx = FALSE;
void main(void)
{
ErrorStatus clk_return_status = ERROR;
clk_return_status = CLK_ClockSwitchConfig(CLK_SWITCHMODE_MANUAL, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);
if (clk_return_status == SUCCESS) //SUCCESS or ERROR
{
CLK_HSECmd(ENABLE);
CLK_HSICmd(DISABLE);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV4);
}
led_init();
UART1_Init((u32)460800, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
UART1_Cmd(ENABLE);
enableInterrupts();
led_on(0);
while(1)
{
if(new_rx)
{
new_rx = FALSE;
UART1_SendData8(rx);
led_toggle(0);
}
}
}
//UART1 RX Interrupt routine.
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
new_rx = TRUE;
UART1_GetITStatus(UART1_IT_OR);
if(UART1_GetITStatus(UART1_IT_RXNE))
{
rx = UART1_ReceiveData8();
}
}[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我这里用的是stm8152k4,接收字符串,在发送回来,没问题[mw_shl_code=c,true]u8 receive_data[50];
u8 receive_data_num = 0; //接收字节数,以0x0d,0x0a结束
u8 end_flag = 0;
/*
名称:usart_init
功能:初始化串口
输入:无
输出:无
*/
void usart_init()
{
//打开时钟
CLK_PeripheralClockConfig(CLK_Peripheral_USART1,ENABLE);
//初始化参数,115200N81
USART_Init(USART1,115200,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,USART_Mode_Tx|USART_Mode_Rx);
//使能接收中断
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//打开串口
USART_Cmd(USART1, ENABLE);
enableInterrupts();
}
//中断配置函数
INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler,28)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE)) //判断中断标志
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除标志
if(0x00 == end_flag) //没结束
{
if(USART_ReceiveData8(USART1) == 0x0d)
{
end_flag = 0x0d; //赋值0x0d
}
else
{
receive_data[receive_data_num] = USART_ReceiveData8(USART1);
receive_data_num++;
}
}
else if(0x0d == end_flag) //等于0x0d的时候,再检测是否等于0x0a
{
if(USART_ReceiveData8(USART1) == 0x0a)
{
end_flag = 0x0a; //赋值0x0a,一串数据接收完毕
receive_data_num = 0;
}
else
{
//接收错误
printf("数据接收错误 ");
end_flag = 0x00; //重新开始接收
receive_data_num = 0;
}
}
}
}
int putchar(int ch) //重新定义
{
// 将Printf内容发往串口
USART_SendData8(USART1,(unsigned char) ch);
while (!USART_GetFlagStatus(USART1,USART_FLAG_TXE));//如果发送未完成, //标志位未置位,则循环等待
return (ch);
}
void main(void)
{
delay_init();
// lowpower_init();
usart_init();
while (1)
{
if(0x0a == end_flag)
{
end_flag = 0x00;
//接收完毕
printf("%s ",receive_data);
LED_ON;
delay_ms(10);
LED_OFF;
}
}
}
[/mw_shl_code]
一周热门 更多>