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

樹(shù)莓派4B與智能插排通過(guò)RS485(modbus RTU協(xié)議)通信

這篇具有很好參考價(jià)值的文章主要介紹了樹(shù)莓派4B與智能插排通過(guò)RS485(modbus RTU協(xié)議)通信。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目標(biāo):使用樹(shù)莓派4B與CANHAT擴(kuò)展板讀取智能插排測(cè)量的各項(xiàng)數(shù)據(jù)(RS485+modbus RTU),獲取的數(shù)據(jù)上傳到Hyperledger Fabric框架。

之前學(xué)習(xí)過(guò)了modbus RTU協(xié)議,在智能渦輪流量計(jì)的實(shí)驗(yàn)中應(yīng)用過(guò)一次,這次用這個(gè)帶485模塊的智能插座再?gòu)?fù)習(xí)一次~

實(shí)驗(yàn)材料:

樹(shù)莓派4B/8G:

樹(shù)莓派 modbus,樹(shù)莓派,區(qū)塊鏈,python,fabric,linux

?CANHAT擴(kuò)展板:

樹(shù)莓派 modbus,樹(shù)莓派,區(qū)塊鏈,python,fabric,linux

?USB-485轉(zhuǎn)換器:

樹(shù)莓派 modbus,樹(shù)莓派,區(qū)塊鏈,python,fabric,linux

?RS485機(jī)柜排插:

樹(shù)莓派 modbus,樹(shù)莓派,區(qū)塊鏈,python,fabric,linux

?RJ45水晶頭轉(zhuǎn)8PIN端子:

樹(shù)莓派 modbus,樹(shù)莓派,區(qū)塊鏈,python,fabric,linux

?樹(shù)莓派相關(guān)庫(kù)與例程在上次實(shí)驗(yàn)已經(jīng)安裝過(guò)了,步驟可參照官網(wǎng):

RS485 CAN HAT - Waveshare Wiki

一、PC端串口測(cè)試

還是先使用PC端的串口調(diào)試助手測(cè)試一下智能插座的通訊。先將設(shè)備正確接線(xiàn):

樹(shù)莓派 modbus,樹(shù)莓派,區(qū)塊鏈,python,fabric,linux

?這次的智能插排RS485模塊接線(xiàn)口是水晶頭而不是通常的AB端子,所以還需要一個(gè)水晶頭轉(zhuǎn)端子線(xiàn),接線(xiàn)如上圖的說(shuō)明書(shū)所示。

調(diào)試前先看看設(shè)備的通信說(shuō)明書(shū):

樹(shù)莓派 modbus,樹(shù)莓派,區(qū)塊鏈,python,fabric,linux

?可以看到一個(gè)寄存器同樣也是表示2字節(jié)的數(shù)據(jù),電量用兩個(gè)寄存器表示也就是4個(gè)字節(jié),其他數(shù)據(jù)應(yīng)該都只占用一個(gè)寄存器。這次的說(shuō)明書(shū)詳細(xì)一些,還給出了數(shù)據(jù)轉(zhuǎn)換公式。

具體各項(xiàng)數(shù)據(jù)存儲(chǔ)的寄存器地址如下:

樹(shù)莓派 modbus,樹(shù)莓派,區(qū)塊鏈,python,fabric,linux

?計(jì)算一下需要用到的modbus命令:

01 03 00 48 00 01 04 1C    查詢(xún)電壓值
01 03 00 49 00 01 55 DC    查詢(xún)電流值
01 03 00 4A 00 01 A5 DC    查詢(xún)有功功率
01 03 00 4B 00 02 B4 1D    查詢(xún)有功總電能
01 03 00 4D 00 01 14 1D    查詢(xún)功率因數(shù)
01 03 00 4E 00 02 A4 1C    查詢(xún)二氧化碳排量

以查詢(xún)有功總電能為例,串口調(diào)試助手發(fā)送命令后接收到如下數(shù)據(jù):

樹(shù)莓派 modbus,樹(shù)莓派,區(qū)塊鏈,python,fabric,linux

數(shù)據(jù)位為“00 00 01 23”,十進(jìn)制數(shù)值為291,根據(jù)數(shù)據(jù)轉(zhuǎn)換公式值=DATA/3200,算得有功總電能為0.09kWh,經(jīng)驗(yàn)證數(shù)據(jù)無(wú)誤:

樹(shù)莓派 modbus,樹(shù)莓派,區(qū)塊鏈,python,fabric,linux

?二、樹(shù)莓派與智能插排通信

python文件編寫(xiě)如下:

receive.py:

# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import serial
 
EN_485 =  4
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(EN_485,GPIO.OUT)
GPIO.output(EN_485,GPIO.LOW)
 
ser = serial.Serial("/dev/ttyAMA0",9600,timeout=1)  # open first serial port    
while 1:  
    Str = ser.readall()  
    if Str:  
        print (Str)
        string=Str.hex()
        print(string)
        #print(res)
        note=open('/home/pi/Desktop/hyperledger/multinodes-pi/data.txt',mode='w')
        note.write(string)
        note.close()
        #break
 

receive.py與上次實(shí)驗(yàn)有所區(qū)別,主要因?yàn)檫@次查詢(xún)的數(shù)據(jù)較多,且每種數(shù)據(jù)儲(chǔ)存方式不同,如電流電壓等都儲(chǔ)存在一個(gè)寄存器中,也就是說(shuō)返回的數(shù)據(jù)位是2個(gè)字節(jié),而電能與二氧化碳排量存儲(chǔ)在兩個(gè)寄存器中,所以返回的數(shù)據(jù)為4個(gè)字節(jié),所以需要截取的數(shù)據(jù)位是不同的。除此以外相比于渦輪流量計(jì)查詢(xún)到的數(shù)據(jù),這次實(shí)驗(yàn)查詢(xún)到的不同的值轉(zhuǎn)換公式也不同,如有功功率就是返回的數(shù)據(jù)位轉(zhuǎn)化成十進(jìn)制后的值,單位為W;而有功總電能則是返回的數(shù)據(jù)轉(zhuǎn)化為十進(jìn)制后再除以3200,單位為kWh。所以我準(zhǔn)備在receive接收返碼時(shí)進(jìn)行一次判斷,因?yàn)楫?dāng)返回的數(shù)據(jù)位有2個(gè)字節(jié)時(shí),返碼總長(zhǎng)度為7字節(jié);返回?cái)?shù)據(jù)位有4個(gè)字節(jié)時(shí),返碼總長(zhǎng)度為9字節(jié)。所以通過(guò)接收到的數(shù)組長(zhǎng)度就能確定需要截取的數(shù)據(jù)位的位置了,如果返碼總長(zhǎng)度為7字節(jié),截取[6:10],總長(zhǎng)度為9字節(jié),則截取[6:14]。截取數(shù)據(jù)位之后將其轉(zhuǎn)為十進(jìn)制存入data.txt,操作data時(shí)我感覺(jué)用shell命令處理這么多浮點(diǎn)數(shù)的運(yùn)算寫(xiě)起來(lái)比較麻煩,所以在shell腳本調(diào)用指定的send.py數(shù)據(jù)查詢(xún)1s后,依據(jù)查詢(xún)的數(shù)據(jù)類(lèi)型在對(duì)應(yīng)的send文件中將data.txt文件的數(shù)據(jù)進(jìn)行換算再重新寫(xiě)入,最后data.txt中存的就是我需要的最終數(shù)據(jù)。

send.py

# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import serial

EN_485 =  4
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(EN_485,GPIO.OUT)
GPIO.output(EN_485,GPIO.HIGH)

t = serial.Serial("/dev/ttyAMA0",9600)    
print (t.portstr)    
strInput = '01 03 00 00 00 02 C4 0B'
str=bytes.fromhex(strInput)
print(str)
n = t.write(str)    
print (n)    

send文件通過(guò)修改strInput來(lái)發(fā)送不同的查詢(xún)命令,將得到的結(jié)果存入data.txt并使用腳本讀取。在send文件中還需要進(jìn)行數(shù)據(jù)轉(zhuǎn)換操作,不同數(shù)據(jù)轉(zhuǎn)換公式不同,下面是電壓voltage與總電能energy的查詢(xún)文件:

voltage.py:

# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import serial
import time

EN_485 =  4
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(EN_485,GPIO.OUT)
GPIO.output(EN_485,GPIO.HIGH)

t = serial.Serial("/dev/ttyAMA0",9600)    
#print (t.portstr)    
strInput = '01 03 00 48 00 01 04 1C'
string=bytes.fromhex(strInput)
#print(string)
n = t.write(string)    
#print (n)
time.sleep(2)
f=open('/home/pi/Desktop/hyperledger/multinodes-pi/data.txt',mode='r')
data=f.readlines()
f.close()
res=int(data[0])
res=float(res)/100
f=open('/home/pi/Desktop/hyperledger/multinodes-pi/data.txt',mode='w')
f.write(str(res))
f.close()
time.sleep(1)


energy.py:

# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import serial
import time

EN_485 =  4
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(EN_485,GPIO.OUT)
GPIO.output(EN_485,GPIO.HIGH)

t = serial.Serial("/dev/ttyAMA0",9600)    
#print (t.portstr)    
strInput = '01 03 00 4B 00 02 B4 1D'
string=bytes.fromhex(strInput)
#print(string)
n = t.write(string)    
#print (n)
time.sleep(2)
f=open('/home/pi/Desktop/hyperledger/multinodes-pi/data.txt',mode='r')
data=f.readlines()
f.close()
res=int(data[0])
res=float(res)/3200
f=open('/home/pi/Desktop/hyperledger/multinodes-pi/data.txt',mode='w')
f.write(str(res))
f.close()
time.sleep(1)


相對(duì)應(yīng)地,結(jié)合上次實(shí)驗(yàn)的渦輪流量計(jì),對(duì)hyperledger fabric的鏈碼也做了一些修改,預(yù)想的情景下一個(gè)樹(shù)莓派采集一組流量計(jì)、智能插排、氣量計(jì)的數(shù)據(jù)并將其上傳到鏈上,為了方便區(qū)分多組儀表的數(shù)據(jù),Key值再加入三位ID來(lái)表示這一組儀表的編號(hào)。如“2022-8-2 001 003”的Key值表示2022年8月2日這天采集到的ID為001的這組儀表的第3條數(shù)據(jù)。

修改后鏈碼如下:

/*
SPDX-License-Identifier: Apache-2.0
*/

package main

import (
	"encoding/json"
	"fmt"

	"github.com/hyperledger/fabric-contract-api-go/contractapi"
)

type SmartContract struct {
	contractapi.Contract
}

type Data struct {
	Flow_now	string `json:"flow_now(L/H)"`
	Flow_total   	string `json:"flow_total(L)"`
	Voltage	string `json:"voltage(V)"`
	Current	string `json:"current(A)"`
	Power		string `json:"power(W)"`
	Energy		string `json:"energy(kWh)"`
	Factor		string `json:"factor"`
	Emissions	string `json:"emissions(Kg)"`
	Time		string `json:"time"`
}

type QueryResult struct {
	Key    string `json:"Key"`
	Record *Data
}

func (s *SmartContract) InitLedger(ctx contractapi.TransactionContextInterface) error {
	datas := []Data{
		Data{Flow_now: "0", Flow_total: "0", Voltage: "0", Current: "0", Power: "0", Energy: "0", Factor: "0", Emissions: "0", Time: "00:00"},
	}

	for data := range datas {
		dataAsBytes, _ := json.Marshal(data)
		err := ctx.GetStub().PutState("2022-07-20 000 000", dataAsBytes)

		if err != nil {
			return fmt.Errorf("Failed to put to world state. %s", err.Error())
		}
	}

	return nil
}

func (s *SmartContract) AddData(ctx contractapi.TransactionContextInterface, dataNumber string, flow_now string, flow_total string, voltage string, current string, power string, energy string, factor string, emissions string, time string) error {
	data := Data{
		Flow_now:	flow_now,
		Flow_total:   	flow_total,
		Voltage:	voltage,
		Current:	current,
		Power:		power,
		Energy:	energy,
		Factor:	factor,
		Emissions:	emissions,
		Time:		time,
	}

	dataAsBytes, _ := json.Marshal(data)

	return ctx.GetStub().PutState(dataNumber, dataAsBytes)
}

func (s *SmartContract) QueryData(ctx contractapi.TransactionContextInterface, dataNumber string) (*Data, error) {
	dataAsBytes, err := ctx.GetStub().GetState(dataNumber)

	if err != nil {
		return nil, fmt.Errorf("Failed to read from world state. %s", err.Error())
	}

	if dataAsBytes == nil {
		return nil, fmt.Errorf("%s does not exist", dataNumber)
	}

	data := new(Data)
	_ = json.Unmarshal(dataAsBytes, data)

	return data, nil
}

func (s *SmartContract) QueryAllDatas(ctx contractapi.TransactionContextInterface) ([]QueryResult, error) {
	startKey := ""
	endKey := ""

	resultsIterator, err := ctx.GetStub().GetStateByRange(startKey, endKey)

	if err != nil {
		return nil, err
	}
	defer resultsIterator.Close()

	results := []QueryResult{}

	for resultsIterator.HasNext() {
		queryResponse, err := resultsIterator.Next()

		if err != nil {
			return nil, err
		}

		data := new(Data)
		_ = json.Unmarshal(queryResponse.Value, data)

		queryResult := QueryResult{Key: queryResponse.Key, Record: data}
		results = append(results, queryResult)
	}

	return results, nil
}

func main() {

	chaincode, err := contractapi.NewChaincode(new(SmartContract))

	if err != nil {
		fmt.Printf("Error create test chaincode: %s", err.Error())
		return
	}

	if err := chaincode.Start(); err != nil {
		fmt.Printf("Error starting test chaincode: %s", err.Error())
	}
}

shell腳本:

#!/bin/bash
pre=$(date "+%Y-%m-%d")
num="1"
for i in {1..20}
do
	now=$(date "+%Y-%m-%d")
	if [ $pre != $now ]
	then
		num="1"
		pre=$now
	fi
	id=$num
	len=${#id}
	while [ $len -le 2 ]
	do
		id="0"$id
		let len+=1
	done
	let num+=1
	time=$(date "+%H:%M")
	res=$now" 001 "$id
	sudo python /home/pi/RS485_CAN_HAT_Code/485/python/voltage.py
	echo " " >> data.txt
	while read rows
	do
		voltage=$rows
		break
	done < data.txt
	sudo python /home/pi/RS485_CAN_HAT_Code/485/python/current.py
	echo " " >> data.txt
	while read rows
	do
		current=$rows
		break
	done < data.txt
	sudo python /home/pi/RS485_CAN_HAT_Code/485/python/power.py
	echo " " >> data.txt
	while read rows
	do
		power=$rows
		break
	done < data.txt
	sudo python /home/pi/RS485_CAN_HAT_Code/485/python/energy.py
	echo " " >> data.txt
	while read rows
	do
		energy=$rows
		break
	done < data.txt
	sudo python /home/pi/RS485_CAN_HAT_Code/485/python/factor.py
	echo " " >> data.txt
	while read rows
	do
		factor=$rows
		break
	done < data.txt
	sudo python /home/pi/RS485_CAN_HAT_Code/485/python/emissions.py
	echo " " >> data.txt
	while read rows
	do
		emissions=$rows
		break
	done < data.txt
	echo "這是第"$i"次查詢(xún)到并添加的數(shù)據(jù):"
	echo "flow_now(L/H):"$n" flow_total(L):"$t" voltage(V):"$voltage" current(A):"$current" power(W):"$power" energy(kWh):"$energy" factor:"$factor" emissions(Kg):"$emissions" time:"$time
	n=0
	t=0
	cmd="'{\"Args\":[\"AddData\",\"$res\",\"$n\",\"$t\",\"$voltage\",\"$current\",\"$power\",\"$energy\",\"$factor\",\"$emissions\",\"$time\"]}'"
	echo "Add命令:"$cmd
	echo "#!/bin/bash
peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n test --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c "$cmd "
exit"> add.sh 
 docker cp add.sh cli:/opt/gopath/src/github.com/hyperledger/fabric/peer/
 docker exec -it cli bash add.sh
	sleep 42
#break
done

腳本運(yùn)行結(jié)果:

樹(shù)莓派 modbus,樹(shù)莓派,區(qū)塊鏈,python,fabric,linux

Org1查詢(xún)結(jié)果:

樹(shù)莓派 modbus,樹(shù)莓派,區(qū)塊鏈,python,fabric,linux

?~~

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-791419.html

到了這里,關(guān)于樹(shù)莓派4B與智能插排通過(guò)RS485(modbus RTU協(xié)議)通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(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)文章

  • 【正點(diǎn)原子STM32】RS485串行通信標(biāo)準(zhǔn)(串口基礎(chǔ)協(xié)議 和 MODBUS協(xié)議、總線(xiàn)連接、通信電路、通信波形圖、RS485相關(guān)HAL庫(kù)驅(qū)動(dòng)、RS485配置步驟、)

    【正點(diǎn)原子STM32】RS485串行通信標(biāo)準(zhǔn)(串口基礎(chǔ)協(xié)議 和 MODBUS協(xié)議、總線(xiàn)連接、通信電路、通信波形圖、RS485相關(guān)HAL庫(kù)驅(qū)動(dòng)、RS485配置步驟、)

    一、RS485介紹 二、RS485相關(guān)HAL庫(kù)驅(qū)動(dòng)介紹 三、RS485配置步驟 四、編程實(shí)戰(zhàn) 五、總結(jié) 串口、UART、TTL、RS232、RS422和RS485之間的關(guān)系可以如此理解: 串口 :是一個(gè)廣義術(shù)語(yǔ),通常指的是采用串行通信協(xié)議的接口,它可以包括多種具體的物理接口標(biāo)準(zhǔn)和邏輯電平標(biāo)準(zhǔn)。 UART (通用

    2024年04月13日
    瀏覽(29)
  • STM32實(shí)現(xiàn)基于RS485的簡(jiǎn)單的Modbus協(xié)議

    STM32實(shí)現(xiàn)基于RS485的簡(jiǎn)單的Modbus協(xié)議

    我這里用STM32實(shí)現(xiàn),其實(shí)可以搬移到其他MCU,之前有項(xiàng)目使用STM32實(shí)現(xiàn)Modbus協(xié)議 這個(gè)場(chǎng)景比較正常,很多時(shí)候都能碰到 這里主要是Modbus和變頻器通信 最常見(jiàn)的是使用Modbus實(shí)現(xiàn)傳感器數(shù)據(jù)的采集,我記得之前用過(guò)一些傳感器都是Modbus協(xié)議 這就需要MCU實(shí)現(xiàn)Modbus協(xié)議,不過(guò)實(shí)際使

    2024年02月08日
    瀏覽(31)
  • 搬運(yùn)機(jī)器人RFID傳感器CNS-RFID-01|1S的RS485(MODBUS|HS協(xié)議)通訊連接方法

    搬運(yùn)機(jī)器人RFID傳感器CNS-RFID-01|1S的RS485(MODBUS|HS協(xié)議)通訊連接方法

    搬運(yùn)機(jī)器人RFID傳感器CNS-RFID-01|1S支持RS485通信,可支持RS485(MODBUS RTU)協(xié)議、RS485-HS協(xié)議,廣泛應(yīng)用于物流倉(cāng)儲(chǔ),立庫(kù) AGV|無(wú)人叉車(chē)|搬送機(jī)器人等領(lǐng)域,常用定位、駐車(chē)等,本篇重點(diǎn)介紹CNS-RFID-01|1S RFID傳感器的RS485通信連接方法。 CNS-RFID-01|1S RFID傳感器 1、RS485連接方法 用線(xiàn)纜

    2024年02月04日
    瀏覽(29)
  • ESP32 使用RS485模塊實(shí)現(xiàn)Modbus通信(二)

    ESP32 使用RS485模塊實(shí)現(xiàn)Modbus通信(二)

    MODBUS是一種廣泛使用的工業(yè)通信協(xié)議,它允許通過(guò)串行線(xiàn)路在不同設(shè)備之間進(jìn)行通信和數(shù)據(jù)交換。RS485模塊是一個(gè)在ESP32上實(shí)現(xiàn)MODBUS協(xié)議的硬件。在本教程中,我們將使用RS485模塊在ESP32開(kāi)發(fā)板上創(chuàng)建一個(gè)MODBUS主機(jī)和從機(jī)設(shè)備,并實(shí)現(xiàn)與MODBUS主機(jī)的通信。 多個(gè)Modbus(Server)從機(jī)設(shè)備

    2024年01月20日
    瀏覽(28)
  • 【MCAL_UART】-1.2-圖文詳解RS232,RS485和MODBUS的關(guān)系

    【MCAL_UART】-1.2-圖文詳解RS232,RS485和MODBUS的關(guān)系

    目錄 1 UART,RS232和RS485通信拓?fù)?2 什么是RS232 2.1 RS232標(biāo)準(zhǔn)的演變 2.2 RS232標(biāo)準(zhǔn)講了哪些 2.2.1 RS232通信的電平 2.2.2 RS232通信的帶寬 2.2.3 RS232通信距離 2.2.4 RS232通信的機(jī)械接口 3 什么是RS485 3.1 RS485標(biāo)準(zhǔn)的演變 3.2 RS485標(biāo)準(zhǔn)講了哪些 3.2.1 RS485通信的電平 3.2.2 RS485通信的帶寬 3.2.2 RS485通信

    2024年02月05日
    瀏覽(32)
  • Profibus-DP轉(zhuǎn)modbus RTU網(wǎng)關(guān)modbus rtu協(xié)議

    Profibus-DP轉(zhuǎn)modbus RTU網(wǎng)關(guān)modbus rtu協(xié)議

    捷米JM-DPM-RTU網(wǎng)關(guān)在Profibus總線(xiàn)側(cè)實(shí)現(xiàn)主站功能,在Modbus串口側(cè)實(shí)現(xiàn)從站功能??蓪rofibusDP協(xié)議的設(shè)備(如:E+H流量計(jì)、倍福編碼器等)接入到Modbus網(wǎng)絡(luò)中;通過(guò)增加DP/PA耦合器,也可將Profibus PA從站接入Modbus網(wǎng)絡(luò)。在Modbus串口側(cè)提供RS485和RS232兩種電平接口。 捷米JM-DPM-RTU網(wǎng)關(guān)

    2024年02月10日
    瀏覽(21)
  • STM32CUBUMX配置RS485 modbus STM32(從機(jī))親測(cè)可用

    STM32CUBUMX配置RS485 modbus STM32(從機(jī))親測(cè)可用

    ———————————————————————————————————— ? 大家好哇!我是小光,嵌入式愛(ài)好者,一個(gè)想要成為系統(tǒng)架構(gòu)師的大三學(xué)生。 ?最近在開(kāi)發(fā)一個(gè)STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驅(qū)動(dòng),包括ADC、UART、RS485、EEPROM(IIC)、FLASH(SPI)、mod

    2024年02月14日
    瀏覽(27)
  • C# ModBus協(xié)議(RTU )詳細(xì)指南

    C# ModBus協(xié)議(RTU )詳細(xì)指南

    ModBus協(xié)議:官方的解釋是Modbus協(xié)議是一種通信協(xié)議,用于在自動(dòng)化設(shè)備之間進(jìn)行數(shù)據(jù)傳輸。它最初是由Modicon公司于1979年開(kāi)發(fā)的,現(xiàn)在已成為工業(yè)界的一種通用協(xié)議。Modbus協(xié)議有多種變體,包括 Modbus-RTU、Modbus-TCP和Modbus-ASCII 等,其中Modbus-RTU是最常用的變體之一。Modbus協(xié)議基于

    2024年02月04日
    瀏覽(21)
  • STM32開(kāi)發(fā)(六)STM32F103 通信 —— RS485 Modbus通信編程詳解

    STM32開(kāi)發(fā)(六)STM32F103 通信 —— RS485 Modbus通信編程詳解

    ??《上一篇》 ???《主目錄》 ???《下一篇》 了解 RS485 Modbus協(xié)議技術(shù) 。本實(shí)驗(yàn)是基于STM32F103開(kāi)發(fā) 實(shí)現(xiàn) 通過(guò)RS-485實(shí)現(xiàn)modbus協(xié)議。 準(zhǔn)備好了嗎?開(kāi)始我的show time。 1、硬件開(kāi)發(fā)準(zhǔn)備 主控:STM32F103ZET6 RS485收發(fā)器:SP3485P 2、軟件開(kāi)發(fā)準(zhǔn)備 軟件開(kāi)發(fā)使用虛擬機(jī) + VScode + STM32Cub

    2024年02月03日
    瀏覽(24)
  • Modbus-RTU協(xié)議C#實(shí)現(xiàn)

    1、安裝依賴(lài)包 System.IO.Ports 2、讀協(xié)議 3、寫(xiě)協(xié)議 4、CRC16校驗(yàn)

    2024年02月15日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包