请教原子大哥:我用串口做485通讯,发送数据正常,但是接收数据很不正常,偶尔能收到个数据,求解!
#include <stm32f10x_lib.h> // /* STM32F10x???¨?? */
#include "sys.h"
#include "rs485.h"
#include "delay.h"
extern unsigned char Sen_YuLa[ 8 ];
u8 RS485_OK = 0;
u8 TOUCH1 = 0;
u8 RS485_RX_BUF[64]; //????????,×??ó64??×???.
u8 RS485_RX_CNT=0;
void USART1_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //??????????
{
res =USART_ReceiveData(USART1); //????????????????
if( RS485_RX_CNT<64 )
{
RS485_RX_BUF[RS485_RX_CNT]=res; //??????????????
RS485_RX_CNT++; //????????????1
}
}
}
void RS485_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PA8????????
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //???ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //???????ì
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //????????
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,ENABLE);//????????2
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,DISABLE);//????????
USART_InitStructure.USART_BaudRate = bound;//??°??è????9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8???????¤??
USART_InitStructure.USART_StopBits = USART_StopBits_1;//??????????
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(USART1, &USART_InitStructure); //??????????
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel; //USART1_IRQn
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//??????????3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×???????3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ?¨??????
NVIC_Init(&NVIC_InitStructure); //?ù?????¨????????????VIC?????÷
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//????????
USART_Cmd(USART1, ENABLE); //????????
RS485_TX_EN=1; //??????·???????
}
void RS485_Send_Data(u8 *buf,u8 len)
{
u8 t;
RS485_TX_EN=1; //?è????·???????
for(t=0;t<len;t++) //??··???????
{
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{
;
}
USART_SendData(USART1,buf[t]);
}
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{
;
}
RS485_RX_CNT=0;
RS485_TX_EN=0; //?è????????????
}
//RS485?é??????????????
//buf:?????????×???·
//len:???????????¤??
void RS485_Receive_Data(u8 *buf,u8 *len)
{
u8 rxlen=RS485_RX_CNT;
u8 i=0;
*len=0; //??????0
delay_ms(10); //????10ms,????????10ms??????????????????,?ò?????????á??
if(rxlen==RS485_RX_CNT&&rxlen)//????????????,???????ê????
{
for(i=0;i<rxlen;i++)
{
buf=RS485_RX_BUF;
}
*len=RS485_RX_CNT; //????±????????¤??
RS485_RX_CNT=0; //????
}
} |