最近用STM32F103的USART3做RS485通信,接口芯片是SP3485,因为RS485是半双工的工作方式,发送的时候不能接收,接收的时候不能发送,但是为什么我在调试的时候发现运行发送程序时会响应接收中断,且接收到的数据是十六进制的“00”,程序中我只开了接收中断。为此很不解,下面贴出我的部分程序,卡了几天不知道,请大家给点意见。
我的主程序是键一按下就发送一个字符,接收中断服务程序是将接收到的字符发送出去,如果正常的话,那么我按一个键就会PC就收到一个字符,但是我这里是按一下就收到2个字符,前一个是正确的,后一个是十六进制的“00”,因为这是这个“00”是STM32接收到的,再发送给PC的。(不管是两块STM32通信还是STM32和PC通信都会出现这个问题)
USART配置程序:
void RS485_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_2;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART485, &USART_InitStructure);
USART_Cmd(USART485, ENABLE);
//打开接收中断
USART_ITConfig(USART485, USART_IT_RXNE, ENABLE);
}
发送程序:
void RS485PutChar(char c)
{
GPIO_SetBits(GPIOB, GPIO_RS485_DE_PIN);
GPIO_SetBits(GPIOB, GPIO_RS485_RE_PIN);
// 操作SP3458,改为发送模式
Delay(0x1fff); // 此处会触发接收中断
USART_SendData(USART485, c);
while (USART_GetFlagStatus(USART485, USART_FLAG_TXE) == RESET);
Delay(0xffff);
GPIO_ResetBits(GPIOB, GPIO_RS485_RE_PIN);
GPIO_ResetBits(GPIOB, GPIO_RS485_DE_PIN); // 操作SP3458,改为接收模式
}
中断服务程序:
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
GPIO_WriteBit(GPIOB,GPIO_Pin_9,(BitAction)(1-GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)) );
RS485PutChar(USART_ReceiveData(USART3));
//把接收到的字符通过//USART3(RS485)发送出去
}
}
|