作者leeraphael (leeraphael)
看板Python
标题Re: [问题] Python struct pack 动态填值
时间Sun Dec 4 00:16:40 2011
首先先谢谢KSJ,这应该是不用发文问的才是,在下看来对tuple还没有很熟
不过藉由这次机会,有更熟了。
这个用途我是用在网路通信协定中 MODBUS over TCP/IP
它是Master/Slave 架构
Master 会问Slave端data, 不过由於问的资料笔数可以是变动的
Slave端回送的资料就会有差异,所以才需要动态调整资料传输量
基本上我想问的就是如何动态改变pack中资料
至於对应的资料从哪里来呢?
MODBUS 这协定中会定义一份table,里面的内容会对应到你的产品相关控制变数
也就是data mapping的部份。
至於有人应该会问这要用在哪?其实MODBUS通常都是用在工业级产品比较多
比方说一些自动化设备中的控制器,这样管理人员就可以远端遥控多个设备了
其实它也是有RS485的介面,只不过这里是用TCP/IP的header包起来再往外送而已
差别不大
对MODBUS有兴趣的人可以google一下,或是找我一起讨论也可以。 ^_^
(囧 好像跟python有点离题了,应该不会判我劣文吧!XDDD)
Thanks.
※ 引述《KSJ (阿真)》之铭言:
: ※ 引述《leeraphael (leeraphael)》之铭言:
: : 各位先进好,请教一个问题,如下
: : self.packet_struct = struct.Struct('>H H H B B B 3H')
: : # 此处的3H会对应到G1,G2,G3
: : # 问题来了,就是我的3H是希望可以动态变更的
: : # 有时是2H or 3H or 4H 等等
: 稍稍看了一下 官方doc
: 如果希望是可以动态变更 应该是用动态建构吧?
: # n = 动态的
: self.packet_struct = struct.Struct('>H H H B B B '+ str( n ) + 'H')
: : # 但是对应到G1, G2, G3 有办法用array去对应吗?
: : # 因为我用int array, compiler会说少参数,因为array他还是只认为是一个参数
: : values = (self.tx_packet,A\
: : self.tx_packet.B, \
: : self.tx_packet.C, \
: : self.tx_packet.D, \
: : self.tx_packet.E, \
: : self.tx_packet.F, \
: : self.tx_packet.G1,\
: : self.tx_packet.G2,\
: : self.tx_packet.G3)
: : self.responce_data = self.packet_struct.pack(*values)
: 这里有点不懂
: 但是看起来 要9个变数得给它9个 要n个变数就给它n个
: 必须在变数 values 中的个数做一些整合处理
: 因为struct是动态建构的
: values也该是
: 我认为你是想用 类似序列的东西
: (int array??是指什麽 compiler又是@@? 好像c++的东西)
: 好比 G = (1, 2, 3) 或 G = (1, 2) ??
: 然後你塞 values = (a,b,c,d,...,G) 然後被当成一个G 就GG了
: 你可以先 value_first = (a,b,c,d,...) 做一个tuple
: 然後再 values = value_first + G 这样去变动values的长度
: 再放回去就行了
: : 如果问题有不明白的地方,我会在补充说明
: : 先谢谢大家了
: 如果我误解你的意思或是上面有误 还请告诉我
: 感恩
: ps.有空不妨可以分享一下这个module(class)的用途与心得XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 221.120.68.239
1F:推 KSJ:感谢分享:) 12/04 17:27