Я использую tyring для реализации программы python с использованием Twisted для связи с Bluetooth-устройством. Ниже приведен пример код, что я реализовал:Twisted serialport dataReceived() предоставляет фрагментированные данные
from twisted.internet import protocol, reactor
from twisted.internet.serialport import SerialPort
from twisted.protocols import basic
class DeviceBluetooth(basic.Int16StringReceiver):
def connectionMade(self):
print 'Connection made!'
self.sendString('[01] help\n')
def dataReceived(self, data):
print"Response: {0}".format(data)
print "-----"
print "choose message to send: "
print "1. Stim on"
print "2. Stim off"
print "3. Stim status"
print "4. Help"
# user input
ch = input("Choose command :: ")
if int(ch) == 1:
self.sendString('[02] stim on\n')
elif int(ch) == 2:
self.sendString('[03] stim off\n')
elif int(ch) == 3:
self.sendString('[04] stim ?\n')
elif int(ch) == 4:
self.sendString('[05] help\n')
else:
reactor.stop()
SerialPort(DeviceBluetooth(), 'COM20', reactor, baudrate=115200)
reactor.run()
Когда я запускаю программу, я иногда получаю ответ и другие времена, я ничего не получаю. И в большинстве случаев длинные ответы фрагментируются как часть следующего сообщения. У меня есть гипертерминал, чтобы убедиться, что я получаю соответствующий ответ от устройства Bluetooth. Итак, проблема связана с моим кодом.
Есть ли что-то, что я делаю неправильно в своем коде?
Дополнительная модификация/коррекция
Когда я заменить DataReceived функцию() в приведенном выше коде stringReceived(), программа никогда не входит в эту функцию.
Я также попытался выше программы с протоколом LineReceiver, как показано в следующем:
from twisted.internet import protocol, reactor
from twisted.internet.serialport import SerialPort
from twisted.protocols import basic
class DeviceBluetooth(basic.LineReceiver):
def connectionMade(self):
print 'Connection made!'
self.sendLine('[01] help')
def dataReceived(self, data):
print"Response: {0}".format(data)
print "-----"
print "choose message to send: "
print "1. Stim on"
print "2. Stim off"
print "3. Stim status"
print "4. Help"
# user input
ch = input("Choose command :: ")
if int(ch) == 1:
self.sendLine('[02] stim on')
elif int(ch) == 2:
self.sendLine('[03] stim off')
elif int(ch) == 3:
self.sendLine('[04] stim ?')
elif int(ch) == 4:
self.sendLine('[05] help')
else:
reactor.stop()
SerialPort(DeviceBluetooth(), 'COM20', reactor, baudrate=115200)
reactor.run()
У меня та же проблема, как и прежде, с фрагментированных данных из функции DataReceived.
Я заменил данные dataReceived функцией stringReceived и запустил код. Но когда я это делаю, программа даже не вводит функцию stringReceived. Я также попробовал модифицированную версию вышеперечисленных программ с помощью LineReceived protcol, и здесь тоже у меня такая же проблема с фрагментированными данными из функции dataReceived. – siva82kb
Почему вы переключаетесь между Int16StringReceiver и LineReceiver? Какой протокол вы пытаетесь говорить здесь? –
Я пробовал протокол LineReceiver, так как хотел посмотреть, сработало ли оно. Протокол с устройства bluetooth реализован в виде линейного протокола. Я новичок в Twisted, и поэтому пытался попробовать разные вещи. – siva82kb