我正在尝试在Linux上使用Python 列出所有附近/可发现的蓝牙设备,包括那些已配对的蓝牙设备.
我知道如何使用其地址列出设备的服务,并且可以成功连接:
services = bluetooth.find_service(address='...')
Run Code Online (Sandbox Code Playgroud)
阅读PyBluez文档如果我没有指定任何标准,我希望附近的任何设备都能显示出来:
"如果未指定任何条件,则返回检测到的所有附近服务的列表."
我现在需要的"唯一"事情是能够列出已经配对的设备,无论它们是开,关还是不在附近.就像我在Ubuntu/Unity中的All Settings - > Bluetooth中获得的列表一样.
顺便说一句,以下内容未列出我的机器上已配对的设备,即使它们在/附近.可能是因为配对后它们不可发现:
import bluetooth
for d in bluetooth.discover_devices(flush_cache=True):
print d
Run Code Online (Sandbox Code Playgroud)
有任何想法吗 ...?
编辑:我找到并安装了"bluez-tools".
bt-device --list
Run Code Online (Sandbox Code Playgroud)
...给我提供我需要的信息,即添加设备的地址.
我检查了C源,发现这可能不像我想象的那么容易.
仍然不知道如何在Python中这样做...
编辑:我认为DBUS可能是我应该阅读的内容.看起来很复杂.如果有人有一些代码要分享,我会非常高兴.:)
我正在研究一个Arduino项目,由于内存限制,我正在将它与Python脚本连接起来.在Python方面,我有一个2维矩阵,包含坐标的各个x,y值,在这个列表中是26000个坐标对.因此,为了澄清所有人的数据结构pathlist[0][0],将返回列表的第一个坐标的X值.在Python中对此列表执行不同的操作等没有任何问题.然而,我遇到麻烦的是将这些值通过串行发送到Arduino,这是有用的.
由于串行通信的性质(至少我认为是这种情况),我必须将每个整数作为一个字符串发送,一次只发送一个数字.因此,像345这样的数字将作为3个单独的字符发送,当然,这些字符是3,4,然后是5.
我正在努力寻找一种方法来重建Arduino上的整数.
每当我发送一个值时,它就会接收数据并输出它,如下所示:
//Python is sending over the number '25'
2ÿÿ52
//Python is sending the number 431.
4ÿÿ321ÿÿÿ2
Run Code Online (Sandbox Code Playgroud)
Arduino代码是:
String str;
int ds = 4;
void setup() {
Serial.begin(9600);
}
void loop(){
if (Serial.available()>0) {
for (int i=0; i<4; i=i+1) {
char d= Serial.read();
str.concat(d);
}
char t[str.length()+1];
str.toCharArray(t, (sizeof(t)));
int intdata = atoi(t);
Serial.print(intdata);
}
}
Run Code Online (Sandbox Code Playgroud)
Python代码如下所示:
import serial
s = serial.Serial(port='/dev/tty.usbmodemfd131', baudrate=9600)
s.write(str(25))
Run Code Online (Sandbox Code Playgroud)
我几乎可以肯定问题不是源于输出方法(Serial.print),当我声明另一个int时,它在输出上格式正常,所以我假设问题在于如何intdata构造变量.
值得注意的一两件事,可能有助于诊断这个问题是,如果我改变Serial.print(intdata)对Serial.print(intdata+5)我的结果是2ÿÿ57,在这里我希望30(25 …
我正在建立一个数据采集系统.获取的数据通常由15个信号组成,每个信号以(例如)500Hz采样.也就是说,每秒大约15 x 500 x 4字节(有符号浮点数)将到达并且必须保持不变.
以前的版本是在.NET(C#)上构建的,使用DB4O db进行数据存储.这非常有效并且表现良好.
新版本将基于Linux,使用Python(或Erlang)和......是的!什么是合适的存储候选者?
我在想MongoDB,将每个样本(或实际上是一堆样本)存储为BSON对象.每个样本(块)都有一个样本计数器作为密钥(索引)字段,以及信号源标识.
问题是我必须能够很快地检索样本.根据要求,使用样本计数器范围和请求的信号源,必须在不到一秒的时间内检索多达30秒的数据.当前(C#/ DB4O)版本管理此正常,在不到100毫秒的时间内检索数据.
我知道Python可能不是理想的性能,但我们稍后会看到它.
系统("服务器")将连接多个采集客户端,因此架构必须很好地扩展.
编辑: 经过进一步研究后,我可能会使用HDF5获取样本数据,使用Couch或Mongo获取更多类似文档的信息.我会及时向大家发布.
编辑: 最终解决方案基于HDF5和CouchDB.它表现得很好,用Python实现,在Raspberry Pi上运行.
我正在搜索.NET图形组件.它应该能够以扫描(示波器)模式绘制数据,如果可能还可以绘制为滚动波形.在x轴上我想要时间戳(例如18:25:00)并且应该可以绘制两个向量(DateTime []和double []).也就是说,数据点不是等间隔的,而是带有自己的时间戳.表现至关重要; 它应该能够在相当慢的机器上滚动/显示数据.另外,我想在同一图表上有多个(最多12个)y轴,即堆叠波形.数据将很快到达,例如10个通道,每个通道以1000 Hz采样,每200 ms采用一块数据.想法有人吗?
我知道还有其他问题与我的问题非常相似,但它们都没有解决我遇到的问题.
我想pyserial用来访问一个串口(/dev/tty...),但只是在另一个进程尚未打开它的情况下.
以下代码段在我的Ubuntu 12.04计算机上返回四个可用端口,运行一次.如果我第二次运行它,我预计没有可用的端口.遗憾的是,返回了相同的端口列表.似乎pyserial无法确定另一个进程已经打开了端口.
我希望SerialException抛出一个,或者isOpen()返回False 的方法,但很pyserial高兴打开多次.
import serial
from serial import tools
from serial.tools import list_ports
def available_ttys():
for tty in serial.tools.list_ports.comports():
try:
port = serial.Serial(port=tty[0])
if port.isOpen():
yield port
except serial.SerialException as ex:
print 'Port {0} is unavailable: {1}'.format(tty, ex)
def main():
ttys = []
for tty in available_ttys():
ttys.append(tty)
print tty
input('waiting ...')
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
无论我并行运行多少次,这都是输出:
Port ('/dev/ttyS31', 'ttyS31', 'n/a') is unavailable: Could …Run Code Online (Sandbox Code Playgroud) 我有一个简单的 Python 代码,它通过串行端口使用串行通信连接到 Arduino 板。
我正在使用 Python 库“pyserial”。它是Python2.7
我创建了一个连接,基本上是在做类似的事情
ser = serial.Serial("/dev/ttyACM0", 115200)
Run Code Online (Sandbox Code Playgroud)
在此之后,我使用 serial.write 向我的 arduino 板发送命令。我有一个自制的固件,可以读取命令并移动一些电机。
此代码正在运行,目前正在运行。虽然我每天连接和断开几次连接和我的机器人做一些事情。我总是刷新所有东西(serial.flush)。在某些时候,它只是失败了。它似乎连接,但没有执行任何操作。就像在某个时候串行端口损坏了一样。
一旦我重新启动计算机,一切正常。
知道如何在不重新启动计算机的情况下修复它吗?
拔下 USB 电缆不起作用。
我使用socket.recv()通过套接字(蓝牙)从设备接收二进制数据.
我已经考虑过在列表或bytearray中进行缓冲,直到收到足够的数据进行解码和操作.也就是说,直到我收到一个开始和停止标志(字节).
但是,该设备正在应用"八位字节填充".也就是说,下面两个字节的每次出现都应该用一个字节替换,如下所示:
dic = { '\xFE\xDC' : '\xFC' , '\xFE\xDD' : '\xFD' , '\xFE\xDE' : '\xFE'}
Run Code Online (Sandbox Code Playgroud)
此外,在发送数据时,应该应用相反的操作.例如,一个字节0xFC - >产生两个字节0xFE,0xDC.
真正发生的是当填充(发送数据)时,如果检测到0xFC,0xFD,0xFE之一,则在字节之前添加0xFE,该字节本身是异或0x20.在取消填充(接收数据)时,0XFE被丢弃,后面的字节被异或为0x20.
说我对Python很陌生是一种轻描淡写的说法.我昨天开始编码,有一个界面启动并运行.然而,这有点棘手.
我知道我可以将数据放入字符串并进行替换.但是要将二进制数据打包成字符串,替换然后解压缩和解码似乎有点低效.
我还可以观察传入的数据,并在看到0xFE标志时动作.什么是好的是填充/取消列表,bytearray等等的方法.
替换列表或bytearray中的单个字节似乎并不太难,但用两个或另一个方式替换一个...?
任何帮助非常感谢.
(顺便说一下,这是Python 2.7.)
我需要一个丢弃FIFO队列,它会在项目满时自动丢弃.它不必是线程安全的.效率更重要.
也就是说,我需要从设备中采样信号,同时能够在半随机时间检索最后n秒(对象).
我自己实现了一个(不是那么线程安全的)缓冲区,但感觉我在这里重新发明了这个轮子.另外我们每秒都在讨论100个物体.大多数将被丢弃,而例如每次必须检索3000(= 30秒的数据)(例如每十分钟).
Python标准库或其他地方是否已有这样的类?我已经使用了一些goggle-fu但没有找到任何有用的东西.
from Queue import Queue, Full, Empty
import logging
class DiscardingBuffer():
def __init__(self, capacity=0):
self._queue = Queue(maxsize=capacity)
def put(self, item):
while True:
try:
self._queue.put(item, block=False)
logging.debug('Put item: {0}'.format(item))
break
except Full:
discarded_item = self._queue.get(block=False)
logging.debug('Buffer is full. Discarding: {0}'.format(discarded_item))
def flush(self):
items = []
while True:
try:
items.append(self._queue.get(block=False))
except Empty:
logging.debug('Buffer is now empty.')
break
return items
def main():
buf = DiscardingBuffer(5)
for i in xrange(10):
buf.put(i)
logging.debug('Remaining items: {0}'.format(buf.flush()))
logging.debug('Verify …Run Code Online (Sandbox Code Playgroud) 我试图运行一个同学写的脚本并向我演示.所以我知道代码是正确的,它只与我们的机器配置方式有所不同.这是代码:
#!/usr/bin/python
#import statements
import serial
import os
import time
#global constants
control_byte = '\n'
ACL_1_X_addr = ord('X')
ACL_1_Y_addr = ord('Y')
ACL_1_Z_addr = ord('Z')
GYRO_1_X_addr = ord('I')
GYRO_1_Y_addr = ord('J')
GYRO_1_Z_addr = ord('K')
#clear the screen
os.system('clear')
#initialize the serial port
s = serial.Serial()
s.port = 10
s.baudrate = 56818
s.open()
Run Code Online (Sandbox Code Playgroud)
一切都运行到最后一行s.open,它给我错误:
Traceback (most recent call last):
File "serial_reader.py", line 25, in <module>
s.open()
File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 282, in open
self._reconfigurePort()
File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 311, in _reconfigurePort
raise …Run Code Online (Sandbox Code Playgroud) 我想知道是否有办法从Python列表中"弹出所有"项目?
它可以在几行代码中完成,但操作看起来很简单我只是假设必须有一个比复制和清空原始文件更好的方法.我在谷歌搜索了很多,在这里搜索,但无济于事.
我意识到弹出所有项目只会返回原始列表的副本,但这正是我想要做的原因.我不想返回列表,而是返回其中包含的所有项目,同时清除它.
class ListTest():
def __init__(self):
self._internal_list = range(0, 10)
def pop_all(self):
result, self._internal_list = self._internal_list[:], []
return result
# ... instead of:
# return self._internal_list.pop_all()
t = ListTest()
print "popped: ", t.pop_all()
print "popped: ", t.pop_all()
Run Code Online (Sandbox Code Playgroud)
...当然会返回预期的:
popped: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
popped: []
Run Code Online (Sandbox Code Playgroud) python ×9
pyserial ×4
linux ×3
python-2.7 ×3
serial-port ×3
arduino ×2
.net ×1
binary-data ×1
bluetooth ×1
bytearray ×1
charts ×1
fifo ×1
graph ×1
hdf5 ×1
list ×1
oscilloscope ×1
queue ×1
storage ×1
usb ×1
winforms ×1