日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

modbus通讯失败_STM32 MODBUS通讯失败

發布時間:2024/3/24 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 modbus通讯失败_STM32 MODBUS通讯失败 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本帖最后由 njzt 于 2015-3-23 17:23 編輯

收到的數據只有一個字節 00,求解

硬件:STM32L152??MAX3485

MAX3485的A和B之間連接120歐電阻,儀表485也有120歐電阻

PB5 做485的控制端

串口1接485的RX和TX,接收中斷

串口3輸出MODBUS接收到的數據

程序:

/***********************************************************************

* @brief ? ? ? ? ? ? ? ? 串口1初始化

*

* @param??? ? ? ? None

*

* @retval ? ? ? ? None

*

**********************************************************************/

void usart1_config()

{

USART_InitTypeDef? ? ? ? USART_InitStructure;

GPIO_InitTypeDef ? ? ? ? GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);??? ? ? ? ? ? ? ? //----1??串口時鐘使能

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);? ?? ? ? ? ? ? ? ? ? ? ? ???//---2??IO時鐘使能

GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);? ?//--------3 (1) 配置串口管腳

GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;? ???//-------------------? ?(2)??配置管腳 AF 模式

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10; //--------------? ?(3)??配置管腳其他參數

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_Init(GPIOA, &GPIO_InitStructure); //-----------------------------? ?(4)??調用GPIO初始化函數

USART_InitStructure.USART_BaudRate = 9600;? ?//---------------------4? ? ? ? 設置波特率等參數

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No ;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_Init(USART1,&USART_InitStructure);// ---------------------------5 調用串口初始化函數

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 接收中斷

USART_Cmd(USART1, ENABLE);??//----------------------------------------6 開啟串口

}

void NVIC_Config(void)

{

NVIC_InitTypeDef? ? ? ? NVIC_InitStructure;

/************ 配置 USART1 中斷向量*************/

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

中斷入口函數:

void USART1_IRQHandler(void)

{

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

{

USART_ClearITPendingBit(USART1,USART_IT_RXNE);

USART_SendData(USART3,USART_ReceiveData(USART1));

while(USART_GetFlagStatus(USART3,USART_FLAG_TXE) == RESET);

}

}

485控制IO配置:

void MODBUS_GPIO()

{

GPIO_InitTypeDef? ?? ???GPIO_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //GPIO CLOCK Enable

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

}

主函數:

uint8_t msg[8] = {0x01,0x04,0x00,0x00,0x00,0x05,0x30,0x09};

int main(void)

{

uint8_t i;

usart3_config();

usart1_config();

NVIC_Config();

MODBUS_GPIO();

while(1)

{

GPIO_SetBits(GPIOB,GPIO_Pin_5); //485發送

delay_ms(1);

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

{

USART_SendData(USART1,msg);

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

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

//? ? ? ? delay_ms(10);

}

delay_ms(1);

GPIO_ResetBits(GPIOB,GPIO_Pin_5); //485接收

delay_ms(100);

}

}

問題補充:

問題感覺比較奇葩,不接485轉232模塊,串口收不到數據,接上485轉232模塊并接上電腦,數據收發正常

總結

以上是生活随笔為你收集整理的modbus通讯失败_STM32 MODBUS通讯失败的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。