国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[STM32F103C8T6]W5500+Modbus TCP(HAL庫)

這篇具有很好參考價(jià)值的文章主要介紹了[STM32F103C8T6]W5500+Modbus TCP(HAL庫)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔


前言

本章節(jié)是博主學(xué)習(xí)Modbus TCP所寫的一篇文章


一、Modbus TCP是什么?

1.1.1 Modbus TCP介紹

Modbus TCP是Modbus的一個(gè)分支,主要用到網(wǎng)口通信的,在工業(yè)上也用的很頻繁,我們公司最近的項(xiàng)目就是用的W5500+modbus TCP來和PC端的上位機(jī)通信和交互的。雖然這個(gè)項(xiàng)目不是我在寫代碼,但是我都學(xué)了Modbus RTU了,那我也抽空學(xué)習(xí)一下Modbus TCP吧。本次的Modbus TCP不是博主寫的,是一個(gè)大佬開源的一個(gè)W5500寫的一個(gè)Mobus TCP代碼,我在這個(gè)基礎(chǔ)上自己寫了主機(jī)讀從機(jī)多個(gè)數(shù)據(jù),和主機(jī)寫從機(jī)寄存器的函數(shù)。這個(gè)項(xiàng)目搞了一天,主要是一直ping不通,最后ping通了。
Modbus TCP 相較于 Mobus RTU是沒有CRC16校驗(yàn)位的,而且還多了4個(gè)字節(jié)的事務(wù)協(xié)議。

1.1.2 報(bào)文格式

0x03 主機(jī)讀從機(jī)寄存器

/*******************************************************************************	
                             Modbus TCP
主機(jī)保持讀從機(jī)        實(shí)物協(xié)議     字節(jié)長(zhǎng)度    從機(jī)地址  功能碼   起始地址    讀取線圈個(gè)數(shù)
	        主機(jī)    05 95 00 00    00 06        01        03     00 00          00 01
	                  實(shí)物協(xié)議    字節(jié)長(zhǎng)度    從機(jī)地址   功能碼    字節(jié)個(gè)數(shù)     上傳數(shù)據(jù)
	        從機(jī)    05 95 00 00    00 05        01        03       02           00 04
0x03 讀保持寄存器
********************************************************************************/	

0x06 主機(jī)寫從機(jī)寄存器

/*******************************************************************************	
                             Modbus TCP
主機(jī)寫單一從機(jī)             實(shí)物協(xié)議     字節(jié)長(zhǎng)度   從機(jī)地址  功能碼  寄存器地址   下發(fā)數(shù)據(jù)
	            主機(jī)    31 C9 00 00     00 06       01       06       00 00          00 20
	                      實(shí)物協(xié)議     字節(jié)長(zhǎng)度   從機(jī)地址  功能碼  寄存器地址   下發(fā)數(shù)據(jù)
	            從機(jī)    31 C9 00 00     00 06       01       06       00 00          00 20
0x06 寫單一寄存器
********************************************************************************/		

總體來說還是很簡(jiǎn)單的

二、W5500配置

工程源碼:添加鏈接描述,大家記得給博主點(diǎn)贊哈。
首先是配置
然后是查看你的IP地址、網(wǎng)關(guān)、子網(wǎng)掩碼等
Win+R彈出運(yùn)行框,然后輸入cmd進(jìn)入到w5500 modbus,STM32高級(jí)功能,stm32,tcp/ip,嵌入式硬件
然后是 ipconfig/all可以查看IP地址等,這里我用的以太網(wǎng).
w5500 modbus,STM32高級(jí)功能,stm32,tcp/ip,嵌入式硬件
然后可以自己靜態(tài)分配地址 IPv4
w5500 modbus,STM32高級(jí)功能,stm32,tcp/ip,嵌入式硬件
然后就是修改代碼

/*******************************************************************************
* 函數(shù)名  : Load_Net_Parameters
* 描述    : 裝載網(wǎng)絡(luò)參數(shù)
* 輸入    : 無
* 輸出    : 無
* 返回值  : 無
* 說明    : 網(wǎng)關(guān)、掩碼、物理地址、本機(jī)IP地址、端口號(hào)、目的IP地址、目的端口號(hào)、端口工作模式
*******************************************************************************/
void Load_Net_Parameters(void)
{
	Gateway_IP[0] = 192;//加載網(wǎng)關(guān)參數(shù) 
	Gateway_IP[1] = 168;
	Gateway_IP[2] = 1;
	Gateway_IP[3] = 1;

	Sub_Mask[0]=255;//加載子網(wǎng)掩碼
	Sub_Mask[1]=255;
	Sub_Mask[2]=255;
	Sub_Mask[3]=0;

	Phy_Addr[0]=0x08;//加載物理地址 ,這個(gè)可以和主機(jī)的不一樣
	Phy_Addr[1]=0x97;
	Phy_Addr[2]=0x98;
	Phy_Addr[3]=0xBE;
	Phy_Addr[4]=0x2F;
	Phy_Addr[5]=0x7F;

	IP_Addr[0]=192;//加載本機(jī)IP地址
	IP_Addr[1]=168;
	IP_Addr[2]=1;
	IP_Addr[3]=17;

	S0_Port[0] = 0x13;//加載端口0的端口號(hào)5000 
	S0_Port[1] = 0x88;
	
	S0_Mode=TCP_SERVER;//加載端口0的工作模式,TCP服務(wù)端模式
}

然后我們?cè)赾md里面ping一下看通不通
輸入 ping 自己的IP,我這里是 ping 192.168.1.17,下面是Ping成功的情況。
w5500 modbus,STM32高級(jí)功能,stm32,tcp/ip,嵌入式硬件
這個(gè)時(shí)候我們就可以用Modbus調(diào)試了。
w5500 modbus,STM32高級(jí)功能,stm32,tcp/ip,嵌入式硬件

三.讀保持寄存器&&寫單一寄存器函數(shù)

1.代碼展示

/*******************************************************************************
* 函數(shù)名  : Process_Socket_Keep_Read_nData
* 描述    : W5500接收并發(fā)送接收到的多個(gè)數(shù)據(jù)
* 輸入    : s:端口號(hào)
* 輸出    : 無
* 返回值  : 無
* 說明    : 本過程先調(diào)用S_rx_process()從W5500的端口接收數(shù)據(jù)緩沖區(qū)讀取數(shù)據(jù),
*			然后將讀取的數(shù)據(jù)從Rx_Buffer拷貝到Temp_Buffer緩沖區(qū)進(jìn)行處理。
*			處理完畢,將數(shù)據(jù)從Temp_Buffer拷貝到Tx_Buffer緩沖區(qū)。調(diào)用S_tx_process()
*			發(fā)送數(shù)據(jù)。注意這里是發(fā)送多個(gè)數(shù)據(jù)(0x03),寫一個(gè)數(shù)據(jù)是(0x06) 
*******************************************************************************/
void Process_Socket_Keep_Read_nData(SOCKET s,uint8_t* Tx_Buff_datas){
	uint16_t size;
	uint8_t Tx_Buffer_CP[128];
	uint8_t p=0;	
	
	size=Read_SOCK_Data_Buffer(s, Rx_Buffer);
/*******************************************************************************	
                             Modbus TCP
主機(jī)保持讀從機(jī)        實(shí)物協(xié)議    字節(jié)長(zhǎng)度  從機(jī)地址 功能碼  起始地址   讀取線圈個(gè)數(shù)
	            主機(jī)    05 95 00 00    00 06        01        03     00 00          00 01
	                      實(shí)物協(xié)議    字節(jié)長(zhǎng)度  從機(jī)地址 功能碼  字節(jié)個(gè)數(shù)     上傳數(shù)據(jù)
	            從機(jī)    05 95 00 00    00 05        01        03       02           00 04
0x03 讀保持寄存器
********************************************************************************/	
	if(Rx_Buffer[6]==0x01){//判讀是否是該從機(jī)寄存器地址
		if(Rx_Buffer[7]==0x03){//主機(jī)讀取從機(jī)保持讀寄存器
//			printf("PC receive Data(0x03)=");
//			for(int i=0;i<size;i++){
//				printf("0x%X,",Rx_Buffer[i]);		
//			}
//			printf("\r\n");
			//判斷發(fā)送的字節(jié)數(shù)量
			uint16_t Begin_addr=Rx_Buffer[8]<<8;//讀取起始地址高八位
			Begin_addr=Rx_Buffer[9];	//讀取起始地址低八位
			uint16_t End_addr=Rx_Buffer[10]<<8;//讀取結(jié)束地址高八位
			End_addr=Rx_Buffer[11];//讀取結(jié)束地址低八位
			uint16_t RX_SUM=End_addr-Begin_addr;//主機(jī)讀取多少個(gè)數(shù)據(jù)
			uint16_t RX_SUM_size=RX_SUM*2;
			//printf("PULL READ Data=%d\r\n",RX_SUM_size); 
			//判斷事務(wù)協(xié)議后的字節(jié)數(shù)量
			uint16_t start_size=3+RX_SUM_size;
				
			//實(shí)物協(xié)議碼
			Tx_Buffer_CP[0]=Rx_Buffer[0]; 
			Tx_Buffer_CP[1]=Rx_Buffer[1];	
			Tx_Buffer_CP[2]=Rx_Buffer[2]; 	
			Tx_Buffer_CP[3]=Rx_Buffer[3];
			//下發(fā)長(zhǎng)度
			Tx_Buffer_CP[4]=start_size>>8;
			Tx_Buffer_CP[5]=start_size;
			//從機(jī)地址	
			Tx_Buffer_CP[6]=Rx_Buffer[6];
			//功能碼
			Tx_Buffer_CP[7]=Rx_Buffer[7];
			//發(fā)送的字節(jié)長(zhǎng)度
			Tx_Buffer_CP[8]=RX_SUM_size;
			p=9;
			for(int j=0;j<RX_SUM_size;j++){
				if((p+j)%2==1){ //填充高8位
					Tx_Buffer_CP[p+j]=Tx_Buff_datas[j];
				}else{         //填充低8位
					Tx_Buffer_CP[p+j]=Tx_Buff_datas[j];  						
				} 		
			}		
			memcpy(Tx_Buffer, Tx_Buffer_CP, p+RX_SUM_size);
			//printf("size=%d\r\n",p+RX_SUM_size);
			//發(fā)送響應(yīng)報(bào)文
			Write_SOCK_Data_Buffer(0, Tx_Buffer, p+RX_SUM_size);	
		}else if(Rx_Buffer[7]==0x06){//主機(jī)寫從機(jī)單一寄存器
/*******************************************************************************	
                             Modbus TCP
主機(jī)寫單一從機(jī)        實(shí)物協(xié)議    字節(jié)長(zhǎng)度  從機(jī)地址 功能碼  寄存器地址   下發(fā)數(shù)據(jù)
	            主機(jī)    31 C9 00 00     00 06       01       06       00 00          00 20
	                      實(shí)物協(xié)議    字節(jié)長(zhǎng)度  從機(jī)地址 功能碼  寄存器地址   下發(fā)數(shù)據(jù)
	            從機(jī)    31 C9 00 00     00 06       01       06       00 00          00 20
0x06 寫單一寄存器
********************************************************************************/						
			//寫地址
			uint16_t Write_addr=Rx_Buffer[8]>>8;
			Write_addr=Rx_Buffer[9];
			//寫數(shù)據(jù)
			uint16_t Write_data=Rx_Buffer[10]>>8;
			Write_data=Rx_Buffer[11];
			printf("Write_addr=0x%x,Write_data=0x%x\r\n",Write_addr,Write_data);
			
			printf("PC receive Data(0x06)=");
			for(int w=0;w<size;w++){
				printf("0x%X,",Rx_Buffer[w]);		
			}
			printf("\r\n");
		  for(int i=0;i<size;i++){
				Tx_Buffer[i]=Rx_Buffer[i];			
			}
			printf("0x06_data_size=%d\r\n",size);
 			Write_SOCK_Data_Buffer(0, Tx_Buffer, size);
      
			if(Write_addr==0x04){
				if(Write_data==0x01){
					HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);//控制LED燈
					
				}else if(Write_data==0x02){
					HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);									
				}				
			}

			
		}
	}else{
		printf("Not the address, but=0x%X,\r\n",Rx_Buffer[6]);	
	}
}

這里就介紹完了,最后效果展示
w5500 modbus,STM32高級(jí)功能,stm32,tcp/ip,嵌入式硬件

2.參考資料

W5500+STM32F103C8T6進(jìn)行TCP通信(modbus)_junseven164的博客-CSDN博客


總結(jié)

Modbus TCP使用還是非常好的,之前博主沒有學(xué)Modbus的時(shí)候一直用的JSON格式來打包數(shù)據(jù)給上位機(jī)?,F(xiàn)在掌握兩種數(shù)據(jù)格式,美滋滋文章來源地址http://www.zghlxwxcb.cn/news/detail-616176.html

到了這里,關(guān)于[STM32F103C8T6]W5500+Modbus TCP(HAL庫)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SG90舵機(jī)的使用--STM32F103C8T6

    SG90舵機(jī)的使用--STM32F103C8T6

    SG90帶有一個(gè)3P的接頭 根據(jù)顏色分為 黃線(信號(hào)線) 紅線(電源線) 棕色 (地線) 舵機(jī)的 工作電壓 在 4.8V-6V ,接在STM32系統(tǒng)板上驅(qū)動(dòng)不了,所以需要接電源模塊單獨(dú)的5V供電,我使用的是如圖所示的電源模塊 注: 如果STM32系統(tǒng)板供電和舵機(jī)供電不為同一模塊,則需要共地,

    2024年02月03日
    瀏覽(21)
  • STM32---stm32f103c8t6與stm32f103zet6之間的代碼移植轉(zhuǎn)換

    STM32---stm32f103c8t6與stm32f103zet6之間的代碼移植轉(zhuǎn)換

    目錄 一、將c8t6轉(zhuǎn)換為zet6 1、修改啟動(dòng)文件 2、修改芯片 3、將MD修改為HD ?4、下載器的修改 5、修改完成,編譯成功 ?二、將zet6轉(zhuǎn)換為c8t6 最終結(jié)果如下:? ?將STM32F103C8改為STM32F103ZE ? 基本相同,反向即可。 ? ?

    2024年02月06日
    瀏覽(45)
  • [附源碼] STM32F103C8T6+外接MCP4725 外部DAC

    [附源碼] STM32F103C8T6+外接MCP4725 外部DAC

    ????????STM32F103C8T6最小系統(tǒng)板是大家很常用的一款單片機(jī),它內(nèi)部有多個(gè)ADC模數(shù)轉(zhuǎn)換通道,但并 沒有DAC數(shù)模轉(zhuǎn)換功能 ,當(dāng)需要進(jìn)行數(shù)字量轉(zhuǎn)換為模擬量時(shí)就需要借助外部DAC。? ?? ????????MCP4725是具有非易失性存儲(chǔ)器的單通道12位緩沖電壓輸出DAC。用戶可將配置寄存器

    2024年02月04日
    瀏覽(47)
  • JQ8400語音模塊-stm32f103c8t6(內(nèi)含全代碼)-親測(cè)有效

    JQ8400語音模塊-stm32f103c8t6(內(nèi)含全代碼)-親測(cè)有效

    一.模塊介紹 1.常見的JQ8400-FL語音模塊有兩種,一種是帶3W功放,有4M的存儲(chǔ)空間,可通過USB拷貝聲音文件,通過單片機(jī)串口控制;另外一種是附有SD卡槽,用SD卡存儲(chǔ)文件的文件(MP3格式)進(jìn)行語音播報(bào),也是通過單片機(jī)串口控制 2.我用的是二線串口通信,一線的沒試過 3.程序

    2023年04月26日
    瀏覽(21)
  • STM32F103C8T6+ESP8266WIFI+DHT11模塊連接巴法云

    1.MCU:STM32F103C8T6 2.ESP8266:正點(diǎn)原子WIFI模塊 3.串口模塊:正點(diǎn)原子串口模塊 我們對(duì)Markdown編輯器進(jìn)行了一些功能拓展與語法支持,除了標(biāo)準(zhǔn)的Markdown編輯器功能,我們?cè)黾恿巳缦聨c(diǎn)新功能,幫助你用它寫博客: ESP8266固件刷寫 我用的是安信可的固件,可以在官網(wǎng)上下載。正點(diǎn)

    2023年04月27日
    瀏覽(43)
  • 【滄海拾昧】STM32F103C8T6/C6T6的ISP燒錄

    【滄海拾昧】STM32F103C8T6/C6T6的ISP燒錄

    #C0105 滄海茫茫千鐘粟,且拾吾昧一微塵 ——《滄海拾昧集》@CuPhoenix 【閱前敬告】 滄海拾昧集僅做個(gè)人學(xué)習(xí)筆記之用,所述內(nèi)容不專業(yè)不嚴(yán)謹(jǐn)不成體系 【如有問題必是本集記錄有謬,切勿深究】 ??對(duì)于某種STM32F103C8T6/C6T6最小系統(tǒng)板,沒有配置J-LINK/ST-LINK燒錄口,此時(shí)可以

    2024年02月03日
    瀏覽(47)
  • STM32F103C8T6---定時(shí)器1&定時(shí)器8輸出PWM信號(hào)注意事項(xiàng)

    STM32F103C8T6---定時(shí)器1&定時(shí)器8輸出PWM信號(hào)注意事項(xiàng)

    博主今天在驅(qū)動(dòng)定時(shí)器1的通道1輸出PWM信號(hào)的時(shí)候,遇到了好多問題,在這里指出,警醒自己的同時(shí)希望能給各位帶來幫助 首先,第一個(gè)錯(cuò)誤, 第一:PA8引腳默認(rèn)模式就是定時(shí)器1的通道一,我們?cè)诖a里面,直接 將PA8的輸出模式改為復(fù)用推挽輸出,不要去重定向它,也不要

    2024年02月16日
    瀏覽(19)
  • STM32單片機(jī)PWM控制實(shí)現(xiàn)電機(jī)調(diào)速度(小車運(yùn)動(dòng),STM32F103C8T6&TB6612&TT電機(jī))

    STM32單片機(jī)PWM控制實(shí)現(xiàn)電機(jī)調(diào)速度(小車運(yùn)動(dòng),STM32F103C8T6&TB6612&TT電機(jī))

    作者:公子易平 時(shí)間:2023/6/6 前段時(shí)間做一個(gè)智能小車的相關(guān)項(xiàng)目時(shí),發(fā)現(xiàn)很少有人能夠?qū)TM32的PWM控制講清楚,故而書此文,希望對(duì)后來的學(xué)習(xí)者有所幫助。 STM32F103C8T6最小系統(tǒng)板 直流TT電機(jī) 電機(jī)驅(qū)動(dòng)芯片(TB6612) 杜邦線若干 接線情況: TB6612引腳說明: STM32主控芯片與TB6612接

    2024年02月15日
    瀏覽(30)
  • STM32F103C8T6+ESP-01S+MQTT服務(wù)器實(shí)現(xiàn)數(shù)據(jù)上傳和接收(一)

    STM32F103C8T6+ESP-01S+MQTT服務(wù)器實(shí)現(xiàn)數(shù)據(jù)上傳和接收(一)

    文章目錄 STM32F103C8T6+ESP-01S+MQTT服務(wù)器實(shí)現(xiàn)數(shù)據(jù)的上傳和接收(二) ESP-01S推薦使用安信可官網(wǎng)1471號(hào)固件,燒錄配置如下圖。 請(qǐng)?zhí)鎿Q其中里面的內(nèi)容 使用PA9、PA10分別連接ESP8266的RXD、TXD引腳。 由于每次發(fā)送的AT指令都會(huì)被8266通過串口再發(fā)送回來,為了緩解串口的壓力,并且更

    2024年04月17日
    瀏覽(26)
  • STM32F103C8T6+2.4寸SPI TFT觸摸屏代碼+標(biāo)準(zhǔn)庫 項(xiàng)目開發(fā)

    STM32F103C8T6+2.4寸SPI TFT觸摸屏代碼+標(biāo)準(zhǔn)庫 項(xiàng)目開發(fā)

    目錄 模塊清單: 模塊介紹: 1:STM32F103C8T6 2:2.4寸SPI TFT觸摸屏 項(xiàng)目結(jié)果展示 2.4寸 TFT SPI顯示觸摸屏 2.4寸 SPI TFT 顯示觸摸屏代碼下載鏈接: https://download.csdn.net/download/weixin_49492286/88458377 清單 STM32F103C8T6 2.4寸SPI TFT觸摸屏 ????????STM32F103C8T6是意法半導(dǎo)體(STMicroelectronics)推

    2024年02月07日
    瀏覽(88)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包