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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32 Modbus RTU沒有調通,請大家幫忙看下

[復制鏈接]
跳轉到指定樓層
樓主
ID:686311 發表于 2021-10-27 10:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include "RS485.h"

  2. // 變量定義:
  3. uint8_t USART_TX_BUF[64];                                                        //串口數據發送緩存數組(最大可發送64字節數據)

  4. /*******************************************************************************
  5. 函數名稱:Modbus協議CRC校驗函數
  6. 輸入參數:buf                                指向要校驗的數據緩存區基址
  7. 輸入參數:len                                要校驗的字節數
  8. 返回參數:CRC                                校驗結果
  9. 注意事項:無
  10. ********************************************************************************/
  11. static uint16_t CRC_16(uint8_t *buf,uint8_t len)
  12. {
  13.         uint16_t CRC16 = 0xFFFF;
  14.   uint8_t i, j;
  15.         
  16.   for (i = 0; i < len; i++)
  17.   {
  18.     CRC16 ^= buf[i] ;
  19.     for (j = 0; j < 8; j++)
  20.     {
  21.       if ((CRC16 & 0x0001) != 0){CRC16 = (CRC16>>1)^0xA001;}
  22.       else{CRC16 >>= 1;}
  23.     }
  24.    }
  25.     return CRC16;
  26. }


  27. /*******************************************************************************
  28. 函數名稱:RS485數據緩存區初始化函數
  29. 輸入參數:buf                 指向要初始化緩存區的基址
  30. 輸入參數:data                要初始化的數值(一般初始化的值為0x00)
  31. 輸入參數:len                        要初始化的字節長度
  32. 返回參數:無
  33. 注意事項:無
  34. ********************************************************************************/
  35. static void Arry_Init(uint8_t *buf,uint8_t data,uint8_t len)
  36. {
  37.         uint8_t i;                                                                                                                        //索引變量
  38.         for(i=0;i<len;i++)                                                                                        //執行相應次數的字節空間初始化
  39.         {
  40.                 buf[i] = data;                                                                                                //字節空間初始化
  41.         }
  42. }


  43. /*******************************************************************************
  44. 函數名稱:RS485串口參數配置函數
  45. 輸入參數:無
  46. 返回參數:無
  47. 注意事項:無
  48. ********************************************************************************/
  49. void RS485_USART_Config(void)
  50. {
  51.   GPIO_InitTypeDef  GPIO_InitStructure;                                                                                //定義GPIO外設初始化結構體
  52.         USART_InitTypeDef USART_InitStructure;                                                                        //定義USART外設初始化結構體
  53.         
  54.         USART_APBxClkCmd( USART_CLK, ENABLE );                                                                                //使能APB2高速USART1外設時鐘
  55.         USART_GPIO_APBxClkCmd( USART_GPIO_CLK,ENABLE );                                                //使能APB2高速GPIOA外設時鐘
  56.         RS485_GPIO_APBxClkCmd( RS485_GPIO_CLK,ENABLE );                                                //使能接收發送引腳時鐘
  57.         
  58.         //配置發送引腳Tx
  59.         GPIO_InitStructure.GPIO_Pin = USART_TX_PIN;                                                                //配置GPIO端口
  60.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                                //配置為復用推挽輸出
  61.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                        //端口速度配置為50MHz
  62.         GPIO_Init( USART_TX_PORT,&GPIO_InitStructure );                                                //端口初始化
  63.         
  64.         //配置接收引腳Rx
  65.         GPIO_InitStructure.GPIO_Pin = USART_RX_PIN;                                                        //配置GPIO端口
  66.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                //配置為浮空輸入
  67.         GPIO_Init(USART_RX_PORT,&GPIO_InitStructure);                                                //端口初始化
  68.         
  69.         //配置接收或發送使能引腳
  70.         GPIO_InitStructure.GPIO_Pin = RS485_GPIO_PIN;                                                                //配置GPIO端口
  71.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                                //配置為推挽輸出
  72.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                                //端口速度配置為50MHz
  73.         GPIO_Init( RS485_GPIO_PORT,&GPIO_InitStructure );                                                //端口初始化
  74.         
  75.         //配置串口外設
  76.         USART_InitStructure.USART_Mode = USART_Mode_Tx;                                                                                                                                                //配置串口為發送模式
  77.   USART_InitStructure.USART_BaudRate = USART_BAUD;                                                                                                                                        //配置串口波特率
  78.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;                //配置串口硬件控制流
  79.         USART_InitStructure.USART_Parity = USART_Parity_No;                                                                                                                                //配置校驗位為無校驗
  80.         USART_InitStructure.USART_StopBits = USART_StopBits_1;                                                                                                                //配置串口為一個停止位
  81.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;                                                                                                //八位數據幀模式
  82.         USART_Init(USARTx, &USART_InitStructure);                                                                                                                                                                        //USART初始化
  83.         
  84.         USART_ClearFlag(USARTx, USART_FLAG_TC);                                                                        //清除發送完畢標志位TC
  85.         
  86.         USART_Cmd( USARTx,ENABLE );                                                                                                                        //使能串口
  87.         RS485_TXorRX_EN( TX_EN );                                                                                                                                //接收或發送使能引腳默認為接收狀態
  88. }

  89. /*******************************************************************************
  90. 函數名稱:RS485串口發送函數
  91. 輸入參數:buf                                指向數據發送緩存區的首地址
  92. 輸入參數:len                                指定發送的數據長度
  93. 返回參數:無
  94. 注意事項:無
  95. ********************************************************************************/
  96. void RS485_SendData(uint8_t *buf,uint8_t len)
  97. {
  98.         uint8_t i = 0;                                                                                                                                                                                                        //索引變量
  99.         
  100.         RS485_TXorRX_EN( TX_EN );                                                                                                                                                                //使能為發送模式
  101.         Delay_ms(3);
  102.         for(i=0;i<len;i++)                                                                                                                                                                                        //按照相應長度循環發送數據
  103.         {
  104.                 while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) == RESET);                //檢測是否發送完畢
  105.                 USART_SendData(USARTx,buf[i]);                                                                                                                                //將指向的數據發送
  106.         }
  107.         while(USART_GetFlagStatus(USARTx,USART_FLAG_TC) == RESET);                        //檢測是否發送完畢                                                               
  108. }

  109. ///*******************************************************************************
  110. //函數名稱:Modbus協議主機發送0x03(讀寄存器)命令函數
  111. //輸入參數:addr                                要發送命令的從機設備地址
  112. //輸入參數:startable                要讀取的從機寄存器起始地址                        
  113. //輸入參數:len                                        要讀取的寄存器個數
  114. //返回參數:無
  115. //注意事項:無
  116. //********************************************************************************/
  117. //void Modbus_Send_0x03Cmd(uint8_t addr,uint16_t startaddr,uint16_t len)
  118. //{
  119. //        if(len > 0x14){len = 0x14;}                                                                                                                //讀取的寄存器個數只允許讀20個,超出按最大20個讀取(寄存器個數的最大值要根據接收緩存區的大小來決定,可人為定義寄存器個數的最大值)
  120. //        USART_TX_BUF[0] = addr;                                                                                                                                //獲取從機設備地址
  121. //        USART_TX_BUF[1] = 0x03;                                                                                                                                //獲取讀寄存器功能碼(0x03)
  122. //        USART_TX_BUF[2] = (uint8_t)(startaddr>>8);                                                //獲取寄存器基址高字節
  123. //        USART_TX_BUF[3] = (uint8_t)(startaddr&0xFF);                                        //獲取寄存器基址低字節
  124. //        USART_TX_BUF[4] = (uint8_t)(len>>8);                                                                        //獲取讀取寄存器個數高字節
  125. //        USART_TX_BUF[5] = (uint8_t)(len&0xFF);                                                                //獲取讀取寄存器個數低字節
  126. //        ((uint16_t)*(USART_TX_BUF+6)) = CRC_16(USART_TX_BUF,6);//獲取發送數據的CRC校驗結果
  127. //        RS485_SendData(USART_TX_BUF,8);                                                                                                //發送讀寄存器功能命令
  128. //        USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);                                //發送完畢,開串口接收中斷
  129. //}

  130. /*******************************************************************************
  131. 函數名稱:Modbus協議主機發送0x06(寫單個寄存器)命令函數
  132. 輸入參數:addr                                要發送命令的從機設備地址
  133. 輸入參數:startable                要發送的從機寄存器起始地址        
  134. 輸入參數:Data                                要寫入的數據
  135. 返回參數:無
  136. 注意事項:無
  137. ********************************************************************************/
  138. void Modbus_Send_0x06Cmd(uint8_t addr,uint16_t startaddr,uint16_t Data)
  139. {
  140.         unsigned short temp;
  141.         
  142.         USART_TX_BUF[0] = addr;                                                                                                                                        //獲取從機設備地址
  143.         USART_TX_BUF[1] = 0x06;                                                                                                                                        //獲取讀寄存器功能碼(0x06)
  144.         USART_TX_BUF[2] = (uint8_t)(startaddr>>8);                                                        //獲取寄存器基址高字節
  145.         USART_TX_BUF[3] = (uint8_t)(startaddr&0xFF);                                                //獲取寄存器基址低字節
  146.         USART_TX_BUF[4] = (uint8_t)(Data>>8);                                                                                //獲取寫入數據的高字節
  147.         USART_TX_BUF[5] = (uint8_t)(Data&0xFF);                                                                        //獲取寫入數據的低字節
  148.         temp = CRC_16( USART_TX_BUF,6 );
  149.         USART_TX_BUF[6] = (uint8_t)(temp&0xFF);
  150.         USART_TX_BUF[7] = (uint8_t)(temp>>8);
  151.         RS485_SendData(USART_TX_BUF,8);                                                                                                        //發送讀寄存器功能命令
  152. }

  153. ///*******************************************************************************
  154. //函數名稱:Modbus協議主機發送0x10(寫多個寄存器)命令函數
  155. //輸入參數:addr                                要發送命令的從機設備地址
  156. //輸入參數:startable                要寫入的從機寄存器起始地址        (范圍:0~64)
  157. //輸入參數:len                                        要寫入的寄存器個數                                        (范圍:0~255)
  158. //輸入參數:buf                                        指向要發送的數據緩存區
  159. //返回參數:無
  160. //注意事項:無
  161. //********************************************************************************/
  162. //void Modbus_Send_0x10Cmd(uint8_t addr,uint16_t startaddr,uint16_t len,uint16_t *buf)
  163. //{
  164. //        uint8_t i = 0;                                                                                                                                                                //索引變量
  165. //        
  166. //        USART_TX_BUF[0] = addr;                                                                                                                                //獲取從機設備地址                                                                                                
  167. //        USART_TX_BUF[1] = 0x10;                                                                                                                                //獲取寫多個寄存器功能碼(0x10)
  168. //        USART_TX_BUF[2] = (uint8_t)(startaddr>>8);                                                //獲取寄存器基址高字節
  169. //        USART_TX_BUF[3] = (uint8_t)(startaddr&0xFF);                                        //獲取寄存器基址低字節
  170. //        USART_TX_BUF[4] = (uint8_t)(len>>8);                                                                        //獲取寫入數據寄存器個數高字節
  171. //        USART_TX_BUF[5] = (len&0xFF);                                                                                                        //獲取寫入數據寄存器個數低字節
  172. //        USART_TX_BUF[6] = (uint8_t)(len*2);                                                                                //獲取數據的總字節數
  173. //        for(i=0;i<USART_TX_BUF[5];i++)                                                                                                //循環獲取要發送的數據
  174. //        {
  175. //                USART_TX_BUF[7+(i*2)] = (uint8_t)(buf[i]>>8);
  176. //                USART_TX_BUF[8+(i*2)] = (uint8_t)(buf[i]&0xFF);
  177. //        }
  178. //        ((uint16_t)(USART_TX_BUF+(7+USART_TX_BUF[6]))) = CRC_16(USART_TX_BUF,(7+USART_TX_BUF[6]));        //獲取發送數據的CRC校驗結果
  179. //        RS485_SendData(USART_TX_BUF,(9+USART_TX_BUF[6]));                        //發送寫多個寄存器功能命令
  180. //}




  181. #include "stm32f10x.h"
  182. #include "RS485.h"
  183. #include "Delay.h"

  184. void GPIO_Cofing( void );

  185. /*******************************************************************************
  186. 函數名稱:主函數
  187. 輸入參數:無
  188. 返回參數:無
  189. 注意事項:無
  190. ********************************************************************************/
  191. int main(void)
  192. {        
  193.         Delay_Init();
  194.         RS485_USART_Config();
  195.         GPIO_Cofing();
  196.         while(1)
  197.         {
  198.                 Modbus_Send_0x06Cmd(0x01,0x2000,0x0001);                //發送電機正轉信號
  199.                 Delay_ms(20000);
  200. //                Modbus_Send_0x06Cmd(0x01,0x2001,0x0002);                //發送電機正轉信號
  201. //                Delay_ms(1000);
  202.         }
  203. }


  204. void GPIO_Cofing( void )
  205. {
  206.         GPIO_InitTypeDef  GPIO_InitStructure;                                                                                //定義GPIO外設初始化結構體
  207.         
  208.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE );
  209.         GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_Out_PP;
  210.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  211.         GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;
  212.         GPIO_Init( GPIOA, &GPIO_InitStructure );
  213.         
  214.         GPIO_SetBits( GPIOA, GPIO_Pin_6 );
  215.         Delay_ms(3000);
  216. }


復制代碼

STM32 MODBUS.7z

474.52 KB, 下載次數: 26

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

使用道具 舉報

沙發
ID:123289 發表于 2021-10-28 09:49 | 只看該作者
如何才算調通了呢?
回復

使用道具 舉報

板凳
ID:686311 發表于 2021-10-28 13:37 | 只看該作者
yzwzfyz 發表于 2021-10-28 09:49
如何才算調通了呢?

無刷電機沒有反應,程序有發送電機正轉指令   Modbus_Send_0x06Cmd(0x01,0x2000,0x0001);               
回復

使用道具 舉報

地板
ID:123289 發表于 2021-10-29 09:49 | 只看該作者
硬件圖呢,程序有發送電機正轉指令,已發到什么地方了呢?如果證明被電機收到了呢?
回復

使用道具 舉報

5#
ID:686311 發表于 2021-10-29 10:24 | 只看該作者
Modbus RTU通訊發給發到驅動器,驅動器外購的,目前只是寫驅動器字節,沒有讀取,是不是要讀取?但讀取數據也沒有用

V2.pdf

119.93 KB, 下載次數: 14

回復

使用道具 舉報

6#
ID:686311 發表于 2021-10-29 10:41 | 只看該作者
yzwzfyz 發表于 2021-10-29 09:49
硬件圖呢,程序有發送電機正轉指令,已發到什么地方了呢?如果證明被電機收到了呢?

主控發給驅動器,驅動器外購的,目前只是往驅動器寫字節,沒有讀取,是不是要讀取?但讀取數據也沒有用
回復

使用道具 舉報

7#
ID:123289 發表于 2021-10-30 11:26 | 只看該作者
證明一下,驅動器收到了你發的指令,而且指令是正確的,符合驅動器手冊上的要求。
回復

使用道具 舉報

8#
ID:686311 發表于 2021-11-2 19:08 | 只看該作者
yzwzfyz 發表于 2021-10-30 11:26
證明一下,驅動器收到了你發的指令,而且指令是正確的,符合驅動器手冊上的要求。

問題找到了,正轉運行指令改正轉點動指令就可以了,好奇怪
回復

使用道具 舉報

9#
ID:883242 發表于 2021-11-2 19:28 | 只看該作者
zhijie327 發表于 2021-11-2 19:08
問題找到了,正轉運行指令改正轉點動指令就可以了,好奇怪

以后這樣的問題可以用串口助手加USB轉485先調通了,再寫軟件更快一些。
回復

使用道具 舉報

10#
ID:686311 發表于 2021-11-2 20:48 | 只看該作者
Hephaestus 發表于 2021-11-2 19:28
以后這樣的問題可以用串口助手加USB轉485先調通了,再寫軟件更快一些。

好的,謝謝!
回復

使用道具 舉報

11#
ID:165291 發表于 2022-1-13 11:48 | 只看該作者
這個是主站程序唄?請問用的什么型號的單片機?
回復

使用道具 舉報

12#
ID:31164 發表于 2022-2-12 10:11 | 只看該作者
timeabcd 發表于 2022-1-13 11:48
這個是主站程序唄?請問用的什么型號的單片機?

是的,STM32
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产在线一区二区 | 亚洲永久精品国产 | 婷婷91 | 亚洲三区在线观看 | 波多野结衣电影一区 | 中文字幕在线三区 | 久久精品国产亚洲一区二区三区 | 成人精品久久 | 神马久久春色视频 | 狠狠操狠狠干 | 精品国产一区二区三区成人影院 | 国产黄视频在线播放 | 日韩av成人在线观看 | 亚洲精品99久久久久久 | 九色91视频| 男人天堂久久 | 性精品| 日韩欧美精品在线 | а_天堂中文最新版地址 | 韩国理论电影在线 | 欧美黄色录像 | 一本大道久久a久久精二百 欧洲一区二区三区 | 在线视频中文字幕 | 91在线色视频 | 国产精品久久久久久婷婷天堂 | 美女一区 | 国产一区二区在线播放 | 国产精品极品美女在线观看免费 | 免费黄色的视频 | 日韩欧美视频网站 | 伊伊综合网 | 久久久亚洲成人 | 国产成人精品一区二区三区在线 | 国产99视频精品免费播放照片 | 九九99精品| 91中文字幕在线观看 | 日本特黄a级高清免费大片 国产精品久久性 | 一区二区三区四区不卡视频 | 毛片一级电影 | 成人av电影天堂 | 97碰碰碰 |