PC向主机串口1发送的数据,由串口2经MAX485转发,从机接收数据并通过MAX485到串口2,最后控制继电器。目前发现串口1发送485发送的数据正常,从机用示波器测量MAX485和串口2处有信号,但是从机芯片无法接收。主机从机发送正常,单独使用串口2发送到串口1也正常。
串口2是PA2和PA3,使用PA4做MAX485控制引脚
#define RS485_TX GPIO_SetBits(GPIOA,GPIO_Pin_4) //485发送使能(在使用时注意有响应延时)
#define RS485_RX GPIO_ResetBits(GPIOA,GPIO_Pin_4) //485接收使能(在使用时注意有响应延时)
#define USART2_RX_EN 1 //0:不接收;1:接收
#define USART_REC_LEN 200 //定义最大接收字节数 200
u16 USART_RX_STA; // 串口1接收状态标志
u8 USART_RX_BUF[USART_REC_LEN]; //串口1接收缓冲
/**
//功能:RS485串口2初始化
//参数:bound:波特率
//返回值:None
**/
void RS485_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
/*************************************GPIO Config****************************************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
#if USART2_RX_EN
/*************************************USART Config*****************************************/
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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(USART2,&USART_InitStructure);
USART_Cmd(USART1, ENABLE); //使能串口外设
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能串口接收中断
USART_ClearFlag(USART1, USART_FLAG_TC); //软件清除发送完成标志位
/**************************************NVIC Config*****************************************/
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
#endif
RS485_RX; //485默认接收
}
//********************串口2中断服务函数**********//
void USART2_IRQHandler()
{
u16 temp;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断,必须以0x0d,0x0a结尾
{
temp = USART_ReceiveData(USART2); //读取接收到的数据
if((USART_RX_STA & 0x8000) == 0) //接收未完成
{
if(USART_RX_STA & 0x4000) //如果接收到了0x0d
{
if(temp != 0x0a) USART_RX_STA = 0; //接受错误,重新开始接收
else
{
USART_RX_STA |= 0x8000; //接收完成
}
}
else //未收到0x0d
{
if(temp == 0x0d) USART_RX_STA |= 0X4000;
else
{
USART_RX_BUF[USART_RX_STA & 0X3FFF] = temp;
USART_RX_STA++;
if(USART_RX_STA > (USART_REC_LEN - 1)) USART_RX_STA = 0; //接收数据错误,重新开始接收
}
}
}
}else if(USART_GetFlagStatus(USART2,USART_FLAG_IDLE)!=RESET)
{
USART_ClearFlag(USART2,USART_FLAG_IDLE);
}
}
int main()
{
u16 t = 0;
u8 length;
u16 times=0;
SysTick_Init();
Delay_us(100);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC优先级分组2:2位抢占优先级,2位响应优先级
UART1_Init(115200);
UART2_Init(9600);
RS485_Init(9600);
printf("\r\n01 finsh\r\n");
printf("\r\n等待接收\r\n");
while(1)
{
if(USART_RX_STA & 0x8000)
{
RS485_RX;
Delay_ms(100);
length = USART_RX_STA&0X3fff; //获取数据长
printf("\r\nyour massage is:\r\n");
for(t=0;t<length;t++)
{
Delay_us(1000);
SendByte(USART1,USART_RX_BUF[t]);//自己写的发送函数,正常
}
printf("\r\n发送完成\r\n");
RS485_RX;
USART_RX_STA=0;
}else
{
times++;
if(times % 5000 == 0)
{
printf("\r\nlab\r\n");
printf("ALIENTEK\r\n\r\n");
}
if(times % 200 == 0) printf("\r\n waitting \r\n");
if(times % 30 == 0) printf("\r\nsystem runing\n");//提示系统正在运行
Delay_ms(10);
}
}
}