STM32 USART 普通串口应用,调试总结
程序刚初始化时,
//设置为发送使能,接收使能
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
//值开启接收中断。
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
在接收到数据后,把手册拷贝到发送缓冲区,然后开启发送
void USART_Start_Send_Data(USART_TypeDef* USARTx,sCommBufType *psCommBuf)
{
USART_ITConfig(USARTx, USART_IT_TXE, ENABLE);
psCommBuf->pu8Tx_ptr = psCommBuf->au8TxBuf;
USART_SendData(USARTx,*g_sUsart1Buf.pu8Tx_ptr++);
g_sUsart1Buf.u16TxLen--;
}
中断中发送处理函数如下
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
{
//USART_ClearITPendingBit(USART1, USART_IT_TXE);
//g_sUsart1Buf.u16TxLen--;
//g_sUsart1Buf.pu8Tx_ptr++;
if((g_sUsart1Buf.u16TxLen != 0) && (g_sUsart1Buf.pu8Tx_ptr < &g_sUsart1Buf.au8TxBuf[TX1_BUFFLEN-1]))
{
USART_SendData(USART1, *g_sUsart1Buf.pu8Tx_ptr++);
g_sUsart1Buf.u16TxLen--;
}
else
{
USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //关闭发送中断
}
}
}
目前应用的目的,是设备接收到什么串口数据,就返回什么数据,就这种模式得到的情况是,每次发送数据都会少最后一个字节
TX:68 AA AA AA AA AA AA 68 13 00 DF 16 (09:59:55:759)
RX00:68 AA AA AA AA AA AA 68 13 00 DF (09:59:55:917)
后来解决了这个问题。需要注意几个关键点,就能避免这个问题。
1.开启USART_ITConfig(USART1,USART_IT_TXE, ENABLE);时,就会立刻进入发送数据寄存器为空中断。所以void USART_Start_Send_Data(USART_TypeDef* USARTx,sCommBufType *psCommBuf)中的USART_SendData(USARTx,*g_sUsart1Buf.pu8Tx_ptr++);
g_sUsart1Buf.u16TxLen--;可以去掉,直接在中断里面处理。否则会打乱中断处理数据的顺序。
2.开启中断前一定要先清除响应的中断标志位,否则可能出现一些不想要的数据,对于多次运行时,可能性比较大。
3.中断里面不要按照发送完成中断才传输数据,因为这样会造成进入中断的时间变长,因为它要等到移位寄存器中的数据发送完成后才进行中断。可以按照USART_IT_TXE进入中断发送数据,等到最后一个数据时关闭USART_IT_TXE中断,然后打开USART_IT_TC中断。这样既能保证进入中断的时间短,也能保证最后一个数据即使在关掉串口时能真正传送出去。
STM32USART普通串 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)