装备STM32L151CBT6,在一般串口形式。最初没有好好看数据手册,仅仅看着他人的比如写出来一个程序,尽管作用出来了,但不理解其间一些问题的道理,带着这些问题,问了搭档,得到的答案,的确最初级的过错。这说明看数据手册的重要性。看程序和问题如下
程序刚初始化时,
//设置为发送使能,接纳使能
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中止。这样既能确保进入中止的时刻短,也能确保最终一个数据即便在关掉串口时能真实传送出去。