RS485通讯实验,用串口助手发数据给精英版,按KEY0返回接收到的数据给串口助手,但串口助手有数据发出去,而接收不到数据,求助

2019-08-14 01:32发布

//RS485头文件
#ifndef __RS485_H
#define __RS485_H
#include "sys.h"       

void RS485_Init(void);
void RS485_Send_Data(void);
void RS485_Receive_Data(void);

extern u8 RS485_RX_BUF[64];                 //½óêÕ»o3å,×î′ó64¸ö×Ö½ú
extern u8 RS485_RX_CNT;                           //½óêÕμ½μÄêy¾Y3¤¶è
extern u8 RS485_RX_OK;   //½óêÕíê3é±êÖ¾   1Îaíê3é
extern u8 RS485_TX_ON;

//Ä£꽿ØÖÆ
#define RS485_TX_EN                PDout(7)        //485Ä£꽿ØÖÆ.0,½óêÕ;1,·¢Ëí.
//èç1ûÏë′®¿úÖD¶Ï½óêÕ£¬Çë2»òa×¢êíòÔÏÂo궨òå
#define EN_USART2_RX         1                        //0,2»½óêÕ;1,½óêÕ.

#endif


//RS485  C文件
#include "stm32f10x.h"
#include "RS485.h"
#include "delay.h"
#include "led.h"

#ifdef EN_USART2_RX           //èç1ûê1Äüá˽óêÕ

u8 len;
u8 buf[64];
u8 RS485_RX_OK=0;  //½óêÕíê3é       
u8 RS485_TX_ON=0;
u8 RS485_RX_BUF[64];          //½óêÕ»o3å,×î′ó64¸ö×Ö½ú.
u8 RS485_RX_CNT=0;  //½óêÕμ½μÄêy¾Y3¤¶è                   

#endif       


void RS485_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART2_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
       
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
       
USART_DeInit(USART2);
       
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
       
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);

USART2_InitStructure.USART_BaudRate=19200;  //2¨ìØÂê19200
USART2_InitStructure.USART_WordLength=USART_WordLength_8b;  //êy¾Yλ8λ
USART2_InitStructure.USART_StopBits=USART_StopBits_1;  //í£Ö1λ1λ
USART2_InitStructure.USART_Parity=USART_Parity_No ;  //ÎTD£Ñé
USART2_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;  //ÎTó2¼tá÷
USART2_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;  //·¢Ëí/½óêÕê1Äü
USART_Init(USART2,&USART2_InitStructure);  //3õê¼»ˉ′®¿ú3éÔ±±äá¿
USART_Cmd(USART2,ENABLE);  //′®¿úê1Äü

NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;  //USART1諾ÖÖD¶Ï
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;  //í¨μàê1Äü
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;  //ÇàÕ¼óÅÏ輶Îa1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;  //×óóÅÏ輶Îa1
NVIC_Init(&NVIC_InitStructure);  //3õê¼»ˉÖD¶Ï3éÔ±±äá¿
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE );  //′®¿úÖD¶Ïê1Äü(½óêÕ»o3åÇø·Ç¿Õ)

RS485_TX_EN=0;                        //ĬèÏÎa½óêÕÄ£ê½

}       



void USART2_IRQHandler(void)  //êy¾Y½óêÕÖD¶Ï
{
        u8 res;            

        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //½óêÕμ½êy¾Y
        {         
                                  
                res =USART_ReceiveData(USART2);         //¶á衽óêÕμ½μÄêy¾Y
                if(RS485_RX_CNT<64)
                {
                        RS485_RX_BUF[RS485_RX_CNT]=res;                //&#188;&#199;&#194;&#188;&#189;óê&#213;μ&#189;μ&#196;&#214;μ
                        RS485_RX_CNT++;                                                //&#189;óê&#213;êy&#190;Y&#212;&#246;&#188;ó1
                }
        }        
}



//RS4852é&#209;ˉ&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y
//buf:&#189;óê&#213;&#187;o′&#230;ê×μ&#216;&#214;·
//len:&#182;áμ&#189;μ&#196;êy&#190;Y3¤&#182;è
void RS485_Receive_Data()
{
        u8 rxlen=RS485_RX_CNT;        
        u8 i=0;               
               
        delay_ms(10);                //μè′y10ms,á&#172;D&#248;3&#172;1y10ms&#195;&#187;óD&#189;óê&#213;μ&#189;ò&#187;&#184;&#246;êy&#190;Y,&#212;òè&#207;&#206;a&#189;óê&#213;&#189;áê&#248;
       
        if(rxlen==RS485_RX_CNT&&rxlen)//&#189;óê&#213;μ&#189;á&#203;êy&#190;Y,&#199;ò&#189;óê&#213;íê3éá&#203;
        {
               
                for(i=0;i<rxlen;i++)
                {
                        buf[i]=RS485_RX_BUF[i];       
                }               
                len=RS485_RX_CNT;        //&#188;&#199;&#194;&#188;±&#190;′&#206;êy&#190;Y3¤&#182;è
                LED0=0;
                delay_ms(1000);
                RS485_RX_CNT=0;                //&#199;&#229;á&#227;
                RS485_RX_OK=1;  //&#189;óê&#213;íê3é               
                USART_ClearITPendingBit(USART2,USART_IT_RXNE);
                LED0=1;
        }
}



//RS485·¢&#203;ílen&#184;&#246;×&#214;&#189;ú.
//buf:·¢&#203;í&#199;&#248;ê×μ&#216;&#214;·
//len:·¢&#203;íμ&#196;×&#214;&#189;úêy(&#206;aá&#203;oí±&#190;′ú&#194;&#235;μ&#196;&#189;óê&#213;&#198;¥&#197;&#228;,&#213;aà&#239;&#189;¨òé2&#187;òa3&#172;1y64&#184;&#246;×&#214;&#189;ú)
void RS485_Send_Data()
{
        u8 t;
        RS485_TX_EN=1;                        //éè&#214;&#195;&#206;a·¢&#203;í&#196;£ê&#189;
        RS485_RX_OK=0;  //&#189;óê&#213;íê3é
       
        for(t=0;t<len;t++)                //&#209;-&#187;··¢&#203;íêy&#190;Y
        {          
        //        while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);          
                USART_SendData(USART2,buf[t]);
          LED1=0;
        }         

        while(USART_GetFlagStatus(USART2, USART_FLAG_TC) ==RESET);
        delay_ms(1000);
        RS485_RX_CNT=0;       
  RS485_TX_ON=0;
        RS485_TX_EN=0;                                //éè&#214;&#195;&#206;a&#189;óê&#213;&#196;£ê&#189;       
  USART_ClearITPendingBit(USART2,USART_IT_TC);
        LED1=1;
}




//主函数
#include "stm32f10x.h"
#include "led.h"
#include "key.h"
#include "RS485.h"
#include "delay.h"

int main(void)
{         
        u8 key;

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éè&#214;&#195;&#214;D&#182;&#207;ó&#197;&#207;è&#188;&#182;·&#214;×é&#206;a×é2£o2&#206;&#187;&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;£&#172;2&#206;&#187;&#207;ìó|ó&#197;&#207;è&#188;&#182;

        LED_Init();                                  //3&#245;ê&#188;&#187;ˉó&#235;LEDá&#172;&#189;óμ&#196;ó2&#188;t&#189;ó&#191;ú               
        KEY_Init();                                //°′&#188;ü3&#245;ê&#188;&#187;ˉ       
        delay_init();                     //&#209;óê±oˉêy3&#245;ê&#188;&#187;ˉ          
        RS485_Init();        //3&#245;ê&#188;&#187;ˉRS485
       
                                                                          
        while(1)
        {
         key=KEY_Scan(0);
       
               
                if(RS485_RX_OK==1)  //è&#231;1&#251;&#189;óê&#213;íê3é&#212;ò·¢&#203;í
                  {
                         if(key==KEY0_PRES)   //KEY0°′&#207;&#194;,·¢&#203;íò&#187;′&#206;êy&#190;Y
                           {
                            delay_ms(100);
                                  if(key==KEY0_PRES)
                                    {       
                                     RS485_TX_ON=1;                       
                                    }
                                  }
                          if(RS485_TX_ON==1)
                                   {
                                    RS485_Send_Data();                                                             
                                   }
                                         
                          }
                       
          else
       {
                    RS485_Receive_Data();       
                   }                       
                               
                       
        }                       
}                       






// LED   KEY程序都没有问题,所以就没有附上
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
2672751679
2019-08-14 19:20
我这个程序主要是,执行到RS485_Send_Data() 内, RS485_TX_EN=1;这条并没有置为1,也就是说并没有设置成发送模式,我把RS485_TX_EN=0;的地方全注释掉了还不行,用下面这条 if(RS485_TX_EN==1) {LED0=0;}  else{LED0==1;} 监控,证明RS485_TX_EN没有置1,请指点,谢谢
void RS485_Send_Data()
{
        u8 t;
        RS485_TX_EN=1;                        //éè&#214;&#195;&#206;a·¢&#203;í&#196;£ê&#189;
        RS485_RX_OK=0;  //&#189;óê&#213;íê3é
       
        if(RS485_TX_EN==1) {LED0=0;}  else{LED0==1;}

一周热门 更多>