主機從機發送正常,無法接收。串口2和MAX485連接PA4控制MAX485收發。單獨使用串口2接收PC發送的資料,串口1轉發正常。
從機程式和電路如下:
u16 USART_RX_STA; // 串口1接收狀態標志
u8 USART_RX_BUF[USART_REC_LEN]; //串口1接識訓沖
#define USART_REC_LEN 200 //定義最大接收位元組數 200
#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:接收
/**
//功能: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服務中斷函式
//引數:None
//回傳值:None
**/
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請輸入資料,以回車鍵結束\n");
if(times % 30 == 0) printf("\r\nsystem runing\n");//提示系統正在運行
Delay_ms(10);
}
}
}
uj5u.com熱心網友回復:
先進行串口除錯,串口調通了,再插入RS485通信uj5u.com熱心網友回復:
1、時鐘是否配置RS485介面配置時鐘了嗎?
串口時鐘配置了嗎?
2、串口配置
發送和接收使能了嗎?
接收中斷和發送中斷使能了嗎?
3、建議做如下測驗
(1)、RS485埠始終置為【接收】狀態
上位機給單片機發送資料,看是否進行串口接收中斷,并查看接收字符是否正確。
(2)、RS485埠始終置為【發送】狀態
單片機每隔100毫秒給上位機串口軟體發送幾個位元組,看是否進入串口發送中斷,并在上位機串口軟體中查看接收字符是否正確。
總之,一步一步的進行排除
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/45700.html
標籤:單片機/工控
