STM8L051F3串口发送接收数据丢失
牛人请指点下
串口初始化
void Uart1_Init(void)
{
SYSCFG_REMAPPinConfig(REMAP_Pin_USART1TxRxPortA, ENABLE);
CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Fast);//TXD
GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_In_PU_No_IT);//RXD
GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_2, ENABLE);
GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_3, ENABLE);
// USART_DeInit(USART1); //复位UART1
/*
* 将UART1配置为:
* 波特率 = 38400
* 数据位 = 8
* 1位停止位
* 无校验位
* 使能接收和发送
*/
USART_Init(USART1, (u32)38400, USART_WordLength_8b, USART_StopBits_1,
USART_Parity_No, USART_Mode_Tx|USART_Mode_Rx);
}
数据发送
void UART1_SendByte(u8 data)
{
USART_SendData8(USART1, data);
/* 等待传输结束 */
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
main()
{
u8 UART1_RX_BUF;
CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_8);
while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == RESET); //2MHZ内部晶振
Uart1_Init(); //串口1初始化
while(1)
{
/* 等待接收完成 */
if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE))
{
UART1_RX_BUF = USART_ReceiveData8(USART1);
UART1_SendByte(UART1_RX_BUF );
}
}
以上就是所有程序,
目前问题是:
1.在用电脑串口助手发送数据时,如果一次只发送一个字节,则UART1_RX_BUF = USART_ReceiveData8(USART1)接收的是错误的数据,
2.只有在一次发送数据在两个字节以上时UART1_RX_BUF = USART_ReceiveData8(USART1)接收的数据从第二个字节开始才是准确的,
3.UART1_SendByte(UART1_RX_BUF )在发送第一个字节时会出现数据丢失;
帮顶,跟踪一下,是不是覆盖了 /* 等待接收完成 */
if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE))
{
UART1_RX_BUF = USART_ReceiveData8(USART1);
UART1_SendByte(UART1_RX_BUF );
}
这里有问题吧?没接收完成就开始发送了? 试试Tx也拉高.或者,在TC置位之后再写buf? 帮顶,跟踪一下, RX,TX应该都设置为复用推挽+上拉。 帮顶 在初始化命令
Uart1_Init(); //串口1初始化
后面加一句:
USART_GetITStatus(USART1, USART_FLAG_TC); 在while(1)循环中,在 UART1_RX_BUF = USART_ReceiveData8(USART1);之后再加一句判断是否接收完,接收完才进入发送,没有接收完则继续等待接收完为止才执行下一步。
没用过stm8,不过我想,接收改成中断模式更好吧?
页:
[1]
2