在使用CMake构建一个开源项目时(在我的例子中,它是柠檬图库),当我尝试通过-DBUILD_SHARED_LIBS=1以下方式构建共享库时出现此错误:
TARGETS given no LIBRARY DESTINATION for shared library target
Run Code Online (Sandbox Code Playgroud)
这个错误来自哪里,我该如何解决?
pyserial中的serial.write()方法似乎只发送字符串数据.我有像[0xc0,0x04,0x00]这样的数组,并希望能够通过串口发送/接收它们吗?原始I/O有什么单独的方法吗?
我想我可能需要将数组更改为['\ xc0','\ x04','\ x00'],仍然,null字符可能会造成问题.
我试过谷歌搜索,找不到答案,在这里搜索,找不到答案.有没有人研究从线程a写入Serial()对象(pyserial)是否是线程安全并从线程b执行阻塞读取?
我知道如何使用线程同步原语和线程安全的数据结构,事实上我这个程序的当前形式有一个专用于读取/写入串口的线程,我使用线程安全的数据结构来协调应用程序中的活动.
如果我可以从主线程写入串口(并且从不读取它),我的应用程序将受益匪浅,并使用第二个线程中的阻塞读取从串行端口读取(并且永远不会写入它).如果有人真的希望我进入为什么这会使应用程序受益,我可以添加我的理由.在我看来,只有一个Serial()实例,即使线程B位于Serial对象的阻塞读取中,线程A也可以安全地在Serial对象上使用write方法.
有人知道Serial类是否可以这样使用?
编辑:我觉得答案可能是平台依赖的.如果您对此类平台有任何经验,最好知道您正在使用哪个平台.
编辑:只有一个回复,但如果有其他人尝试过此,请留下您的经验回复.
我一直在使用解析模块构造,并发现自己真的迷恋它的数据结构的声明性质.对于那些不熟悉它的人,您可以编写Python代码,这些代码基本上就像您在实例化时通过嵌套对象尝试解析的内容.
ethernet = Struct("ethernet_header",
Bytes("destination", 6),
Bytes("source", 6),
Enum(UBInt16("type"),
IPv4 = 0x0800,
ARP = 0x0806,
RARP = 0x8035,
X25 = 0x0805,
IPX = 0x8137,
IPv6 = 0x86DD,
),
)
Run Code Online (Sandbox Code Playgroud)
虽然构造实际上不支持在此结构中存储值(您可以将抽象Container解析为字节流或将字节流解析为抽象容器),但我希望扩展框架,以便解析器也可以在解析时存储值可以用点符号ethernet.type访问它们.
但是在这样做时,认为这里最好的解决方案是编写编码/解码机制的通用方法,这样您就可以注册编码/解码机制,并能够从抽象数据结构中生成各种输出(解析器本身) ),以及解析器的输出.
举个例子,默认情况下,当您运行通过解析器打包的以太网时,最终会得到类似dict的内容:
Container(name='ethernet_header',
destination='\x01\x02\x03\x04\x05\x06',
source='\x01\x02\x03\x04\x05\x06',
type=IPX
)
Run Code Online (Sandbox Code Playgroud)
我不想两次解析东西 - 理想情况下我希望解析器以可配置的方式生成'target'对象/字符串/字节.
这个想法的根源在于你可以为消费或处理结构注册各种"插件",这样你就可以以编程方式生成XML或Graphviz图,以及能够从字节转换为Python dicts.任务的关键是,走一个节点树并基于编码器/解码器,转换并返回转换后的对象.
所以问题基本上是 - 哪种模式最适合这个目的?
我查看了编解码器模块,它相当优雅,因为您创建了编码机制,注册您的类可以编码的东西,您可以指定您想要的特定编码.
'blah blah'.encode('utf8')
Run Code Online (Sandbox Code Playgroud)
有一些现有的用于Python的serdes模块的例子,我想起了JSON - 但它的问题在于它非常具体,并且不容易支持任意格式.你可以编码或解码JSON,基本上就是这样.有像这样构造的各种serdes,有些使用load,*dumps*方法,有些则没有.这是一个废话.
objects = json.loads('{'a': 1, 'b': 2})
Run Code Online (Sandbox Code Playgroud)
我对访问者模式并不十分熟悉,但似乎确实有一些可能适用的机制 - 这个想法(如果我理解正确的话),你设置了一个节点访问者,它就是树并应用一些转换(并返回新的对象?)..我在这里很朦胧.
是否有其他机制可能更加pythonic或已经写入?我考虑过使用ElementTree和子类化Elements - 但是我想在做一些愚蠢的事情之前咨询stackoverflow.
我目前在Python中遇到pySerial模块的问题.我的问题涉及连接和断开设备.我可以成功连接到我的设备并与我通信,只要我愿意,并在我想要时断开它.但是,一旦连接断开,我就无法重新连接到设备.
这是我的程序用来与串口连接的包装类:
import serial, tkMessageBox
class Controller:
""" Wrapper class for managing the serial connection with the MS-2000. """
def __init__(self, settings):
self.ser = None
self.settings = settings
def connect(self):
""" Connect or disconnect to MS-2000. Return connection status."""
try:
if self.ser == None:
self.ser = serial.Serial(self.settings['PORT'],
self.settings['BAUDRATE'])
print "Successfully connected to port %r." % self.ser.port
return True
else:
if self.ser.isOpen():
self.ser.close()
print "Disconnected."
return False
else:
self.ser.open()
print "Connected."
return True
except serial.SerialException, e:
return False
def isConnected(self):
'''Is …Run Code Online (Sandbox Code Playgroud) 我正在用Java实现Web服务客户端,它使用wss4j 1.6.8进行WS-Security(为了更加精确,我需要签署SOAP消息).服务器端要求请求具有以下结构:
<Envelope>
<Header>
<wsse:Security mustUnderstand="1">
**<wsu:Timestamp wsu:Id="Timestamp-913ca68e-05ed-44e1-9d6c-b2f293da5a1d">
<wsu:Created>2012-12-21T11:37:31Z</wsu:Created>
<wsu:Expires>2012-12-21T11:42:31Z</wsu:Expires>
</wsu:Timestamp>**
<wsse:BinarySecurityToken>
MIID2jCCAsKg...
</wsse:BinarySecurityToken>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="#Timestamp-913ca68e-05ed-44e1-9d6c-b2f293da5a1d">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>jdVY1HaDLusqO9UcxASE/GQHxyo=</DigestValue>
</Reference>
<Reference URI="#Body-e344eef1-2d8a-42d0-8a30-361ee61a8617">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>L60mQelZERvXgLEgWlW50uJNqEA=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>
NmgACUqrYYc/Kp/F...
</SignatureValue>
<KeyInfo>
<wsse:SecurityTokenReference xmlns="">
<wsse:Reference URI="#SecurityToken-3f054298-711c-4090-95c3-105e1093f3ba" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
</wsse:SecurityTokenReference>
</KeyInfo>
</Signature>
</wsse:Security>
</S:Header>
<S:Body>
Body content...
</S:Body>
</Envelope>
Run Code Online (Sandbox Code Playgroud)
我的解决方案签署文档(正文和时间戳元素),但由于某种原因,wss4j将时间戳元素放在该部分的底部,之后<wsse:BinarySecurityToken>和<Signature>元素出错.请查看签约工作的来源:
public static SOAPMessage signSoapMessage(SOAPMessage message, PrivateKey signingKey, X509Certificate signingCert, char[] passphrase) throws WSSecurityException { …Run Code Online (Sandbox Code Playgroud) 我正在使用XMLSpy和SoapUI,并使用Web服务(ws)调用Fedex来生成标签.来自Fedex的回复是嵌入在Web服务响应中的PNG或PDF文件.如何保存PNG/PDF元素?
我正在尝试为一个名为uLCD32-pt的LCD设备编写一个脚本,问题是您需要以波特率9600连接它,并且为了获得更高的波特率,您必须连接它,发送更改波特率命令,然后以新设置的波特率发送新命令.在绘制像素时,我的液晶显示器显得非常慢,我知道它因为波特率,所以在连接到设备后,他们有什么方法可以改变波特率?到目前为止,这是我的代码?
import serial
import time
#Connect to uLCD32-pt with autobaud
ser = serial.Serial(
port='/dev/ttyUSB0',
baudrate=9600,
timeout=1,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
ser.write("U")
while(True):
#15 x white pixels
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0001)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#1
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0002)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#2
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0003)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#3
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0004)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#4
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0005)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#5
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0006)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#6
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0007)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#7
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0008)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#8
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0009)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#9
ser.write(chr(0x0050)+chr(0x0000)+chr(0x000A)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#10
ser.write(chr(0x0050)+chr(0x0000)+chr(0x000B)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#11
ser.write(chr(0x0050)+chr(0x0000)+chr(0x000C)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#12
ser.write(chr(0x0050)+chr(0x0000)+chr(0x000D)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#13
ser.write(chr(0x0050)+chr(0x0000)+chr(0x000E)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#14
ser.write(chr(0x0050)+chr(0x0000)+chr(0x000F)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#15
ser.write(chr(0x0050)+chr(0x0000)+chr(0x0010)+chr(0x0000)+chr(0x000A)+chr(0x00FF)+chr(0x00FF))#16
Run Code Online (Sandbox Code Playgroud) 为了将shared_ptr分配给柠檬图库中的Graph类型变量,我这样做了:
typedef ListDigraph Graph;
typedef std::shared_ptr<Graph> Process_pointer;
Process_pointer process(new Graph);
Run Code Online (Sandbox Code Playgroud)
它运行正常,但现在我需要为地图对象声明一个shared_ptr,通常地图对象的工作方式如下:
Graph process;
typedef ListDigraph::NodeMap<string> Node_names;
Node_names name(process);
Run Code Online (Sandbox Code Playgroud)
也就是说,name需要Graph对象作为其默认构造函数.
为了声明一个shared_ptr,我这样做了:
typedef ListDigraph::NodeMap<string> Node_names;
typedef std::shared_ptr<Node_names> Nname_pointer;
Nname_pointer name = new Node_names;
name(process);
Run Code Online (Sandbox Code Playgroud)
我知道,名称的声明是错误的,但我如何分配内存以及用进程对象初始化它.
python ×5
pyserial ×4
serial-port ×3
web-services ×2
baud-rate ×1
binary ×1
c++ ×1
cmake ×1
construct ×1
encoding ×1
java ×1
lcd ×1
shared-ptr ×1
soapui ×1
usb ×1
ws-security ×1
xmlspy ×1