* STM32向串口3发送1字节 */
/* */
/* */
/*******************************************************************/
void Uart3_PutChar(u8 ch)
{
/* 发送使能 */
GPIO_SetBits(GPIOF, GPIO_Pin_10); /* DE = 1 */
/* 接收禁止 */
GPIO_SetBits(GPIOF, GPIO_Pin_11); /* nRE = 1 */
USART_SendData(USART3, (u8) ch);
while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); //注意此句与RS232不同
//注意:因为RS485的半双工方式,在RS485发送数据完毕后,需要把RS485设置在接收状态,否则收不到主机的数据
/* 接收使能 */
GPIO_ResetBits(GPIOF, GPIO_Pin_11); /* nRE = 0 */
/* 发送禁止 */
GPIO_ResetBits(GPIOF, GPIO_Pin_10); /* DE = 0 */
}
/*******************************************************************/
/* */
/* STM32在串口3接收1字节 */
/* 说明:串口接收中断 */
/* */
/*******************************************************************/
void USART3_IRQHandler(void) //在中断服务程序中,由于主机响应中断时并不知道是哪个中断源发出中断请求,因此必须在中断服务程序中对中断源进行判别,然后分别进行处理。当然,如果只涉及到一个中断请求,是不用做上述判别的。但是无论什么情况,做上述判别是个好习惯
{
/* 接收使能 */
GPIO_ResetBits(GPIOF, GPIO_Pin_11); /* nRE = 0 */
/* 发送禁止 */
GPIO_ResetBits(GPIOF, GPIO_Pin_10); /* DE = 0 */
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //若接收数据寄存器满
{
comm = USART_ReceiveData(USART3); //此语句作用:将USART_DR寄存器的内容传到comm里。另外,在单缓冲器模式下,软件读USART_DR寄存器则完成对RXNE位清除。[注意]在多缓冲器模式下,必须通过软件清零"传输完成标志"DMA1_FLAG_TCx(即:令DMA_IFCR的位CTCIFx=1),否则将会无法跳出中断服务程序,出现一次中断请求无数次响应的后果
if(comm == 0x63) //上位机自动查找采集器是否在线
{
comm = 0;
Uart3_PutChar(0x63); //发送CP的ASCII码
Uart3_PutChar(0x70);
}
}
}