久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1491|回復: 0
打印 上一主題 下一主題
收起左側

stm32 開發板的通信

[復制鏈接]
跳轉到指定樓層
樓主
ID:984108 發表于 2021-11-25 13:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
void RS485_Init(u32 bound) ;

void RS485_Receive_Data(u8 *ReceiveBuf,u8 *len);

void RS485_Send_Data(u8 *SendBuf ,u8 len);



    void RS485_Init(u32 bound)

{

    GPIO_InitTypeDef GPIO_InitType;

    USART_InitTypeDef USART_InitType;

    NVIC_InitTypeDef NVIC_InitType;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);       //使能GPIOA和GPIOD的時鐘

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);                       //使能USART2的時鐘





    GPIO_InitType.GPIO_Pin=GPIO_Pin_7;                                   //接收或者發送模式控制引腳PD7(初始化之后才能用)

    GPIO_InitType.GPIO_Mode = GPIO_Mode_Out_PP;                       //推挽輸出

    GPIO_InitType.GPIO_Speed=GPIO_Speed_50MHz;                     //這個引腳是485芯片中的發送接收控制引腳

    GPIO_Init(GPIOD,&GPIO_InitType);                                   //當PDout(7)輸出的是高電平‘1’時是發送,為‘0’時是接收



    GPIO_InitType.GPIO_Pin=GPIO_Pin_2;                                  //USART2的TX引腳是PA2

    GPIO_InitType.GPIO_Mode=GPIO_Mode_AF_PP;

    GPIO_InitType.GPIO_Speed=GPIO_Speed_50MHz;

    GPIO_Init(GPIOA,&GPIO_InitType);



    GPIO_InitType.GPIO_Pin=GPIO_Pin_3;                                  //USART2的RX引腳是PA3

    GPIO_InitType.GPIO_Mode=GPIO_Mode_IN_FLOATING;

    GPIO_InitType.GPIO_Speed=GPIO_Speed_50MHz;

    GPIO_Init(GPIOA,&GPIO_InitType);



    #ifdef EN_RS485_RX

        USART_InitType.USART_BaudRate=bound;                                        //串口2的初始化

        USART_InitType.USART_HardwareFlowControl=USART_HardwareFlowControl_None;

        USART_InitType.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;

        USART_InitType.USART_Parity=USART_Parity_No;                       //其中重要的是USART_Mode要既能接收又能發送

        USART_InitType.USART_StopBits=USART_StopBits_1;                   //USART2的波特率都設置為9600

        USART_InitType.USART_WordLength=USART_WordLength_8b;

        USART_Init(USART2,&USART_InitType);



        NVIC_InitType.NVIC_IRQChannel=USART2_IRQn;                          //USART2中斷初始化

        NVIC_InitType.NVIC_IRQChannelCmd=ENABLE;                            //其實這個中斷主要是對發送的數據及時處理,使接收時便捷高效

        NVIC_InitType.NVIC_IRQChannelPreemptionPriority=3;

        NVIC_InitType.NVIC_IRQChannelSubPriority=3;

        NVIC_Init(&NVIC_InitType);





        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);            //要用到USART2中斷除了初始化之外當然要對中斷進行配置以及使能

        USART_Cmd(USART2,ENABLE);                                 //明確發生什么時會進入串口中斷

    #endif

    RX485_TX_EN=0;              //默認接收模式   

}



這里的串口中斷函數,發送的數據被接收數據寄存器接收到,就會觸發中斷,進行處理

#ifdef EN_RS485_RX



u8 RS485_RX_BUF[64];

u8 RS485_RX_CNT=0;

void USART2_IRQHandler(void)       //發送完數據就使能接收中斷,使串口可以接收數據到緩沖區(數組RS485_RX_BUF)中

{

    u8 Res;

    if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)     

    {



        Res=USART_ReceiveData(USART2);

        if(RS485_RX_CNT<64)                         //一次接收的數據最多為64,超過之后將不會對發送過來的數據進行緩存

        {  

            RS485_RX_BUF[RS485_RX_CNT]=Res;

            RS485_RX_CNT++;

        }  

    }

}



#endif











void RS485_Send_Data(u8 *SendBuf ,u8 len)                       //發送處理函數

{

    u8 i;

    RX485_TX_EN=1;

    for(i=0;i<len;i++)                                                          //把長度為len的數組SendBuf發送出去

    {

        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);        //等待發送移位數據寄存器的數據非空時(即發送結束)跳出來

        USART_SendData(USART2,SendBuf[i]);                                          //發送數據

    }

    while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);

    RX485_TX_EN=0;                                                                  //默認接收模式   

    RS485_RX_CNT=0;

}







void RS485_Receive_Data(u8 *ReceiveBuf,u8 *len)                     //接收處理函數

{

    u8 rxlen,i=0;

    rxlen=RS485_RX_CNT;

    delay_ms(10);

    if((rxlen==RS485_RX_CNT)&&rxlen)                             //把中斷函數處理之后的緩存數據取出來

    {

        for(i=0;i<rxlen;i++)

        {

            ReceiveBuf[i]=RS485_RX_BUF[i];                       //傳遞接收到的數據以及長度回去

        }

        *len=RS485_RX_CNT;

        RS485_RX_CNT=0;                                            //對接收的個數進行清零,方便下次接收

    }



}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产一区二区在线观看 | 国内自拍偷拍 | 中文字幕精品三区 | 亚洲永久免费 | 亚洲精品黄色 | 欧美成人激情视频 | 日韩免费在线 | 欧美激情视频一区 | 在线观看国产小视频 | 久久久久免费 | 欧美色偷偷 | 亚洲激情视频在线观看 | 亚洲国产网站 | 97cao| 一级做a爱片性色毛片 | 亚洲高清毛片一区二区 | 他揉捏她两乳不停呻吟动态图 | 中文字幕在线一区二区三区 | 999久久久精品 | 三级在线观看视频 | 国产三级在线免费观看 | 久久精品一区二区三区四区五区 | 九九精品在线观看 | 国产欧美视频在线观看 | 最新超碰 | 日韩亚洲欧美在线 | 国产精品久久久久久久久久久久久久久 | 天天操夜夜干 | 亚洲精品美女 | 三级在线观看 | 操欧美女人 | 欧美日韩一区二区三区视频 | 天天操免费视频 | 日韩av资源 | 国产成人综合在线 | 久久久久国产一区二区三区 | 手机在线看片1024 | 99久久婷婷国产综合精品草原 | 538精品视频| 99久久婷婷国产综合精品草原 | 青青草视频在线观看 |