我一直在进行这个项目,目的是通过蓝牙控制自动驾驶汽车。我正在使用python和PyBluez库与与Arduino Uno接口的HC-06蓝牙接收器进行通信。我的工作正常,但随后尝试实现速度控制和蓝牙的重新连接按钮。它在应用程序启动时曾经用于连接,但是我对此感到厌烦,所以这就是我尝试创建此按钮的原因。可能应该坚持使用我拥有的东西,因为现在它根本无法连接。我不断收到两个相同的错误,要么是[111]:连接被拒绝,要么是[77]:文件描述符处于错误状态。但是,那实际上并没有提供非常有用的信息,而且我仍在尝试找出网络代码中的错误。
我以为HC-06可能已被烧坏,但我可以通过Android手机在蓝牙终端应用程序上连接到它。我尝试过在连接失败后关闭套接字,在初始化时连接套接字,设置套接字超时,并增加端口号,但是似乎没有什么不同。它确实一次成功地与我的连接按钮连接,但是我必须重新启动arduino和应用程序才能执行此操作,此后一直无法重新创建它。
import bluetooth
import socket
class BTconnect:
def __init__(self, in_address, in_port):
self.port = in_port
self.address = in_address
self.sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) #initialize socket
def connect(self):
#tmpsock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) #initialize socket
#tmpsock.settimeout(5)
'''try:
self.sock.connect((self.address, self.port))
except:
print("Connection failed.")
return False
sock.shutdown(socket.SHUT_RDWR)'''
self.sock.connect((self.address, self.port))
print("Connection successful!")
sock = tmpsock
return True
def sendData(self, data):
self.sock.send(bytes(data, 'ascii'))
#self.sock.listen(1)
#echo = self.sock.recv(1024)
#print("ECHO: %s" % echo)
def disconnect(self):
self.sock.close()
print("socket closed")
class Handler:
#TO-DO:
#put all signal handlers here
def on_window1_destroy(self, *args):
print("quit on cancel")
Gtk.main_quit()
connection.disconnect()
def on_connect_button_clicked(self, button):
print("Connecting...")
tmp_connect = BTconnect(address, 2)
#time.sleep(1)
cstatus.set_text("Connecting...")
#time.sleep(1)
#connection.connect()
time.sleep(1)
if tmp_connect.connect():
cstatus.set_text("Connected.")
else:
cstatus.set_text("Disconnected.")
connection = tmp_connect
address = "20:17:05:08:43:07" #input bluetooth address of receiver
connection = BTconnect(address,22)
connection.connect()
Gtk.main()
我希望一旦两个设备成功对接,连接就会读出“连接成功”,但这在这里没有发生。请注意,这有点像科学怪人代码,因为我要从两个文件中提取出完整的程序范围。有什么理由会拒绝连接?还是像我的操作系统中那样的外部问题?