Хорошо я не соглашаюсь с Вашим комментарием по поводу репликации. Можно запустить репликацию путем создания базы данных с нуля, и можно управлять или обновлениями, будет сделан путем обновления доступной клиентской базы данных или просто воссоздания базы данных.
Автоматизированная репликация упростит Вашу работу автоматически руководящими ключами и отношениями.
я думаю, что самая легкая вещь сделать состоит в том, чтобы запустить репликацию моментальных снимков через Studio Сервера MSSQL, получить T-SQL соответствующие сценарии (т.е. соответствующие инструкции T-SQL и для публикации и для подписок), и записать эти сценарии как часть задания в списке Jobs SQL Agent или как задача репликации в папке репликаций.
Возможно, я неправильно понимаю ваш вопрос, но поскольку это последовательная линия, вам придется читать все, что отправлено из Arduino последовательно - это будет сохранено в Arduino, пока вы не прочитаете это.
Если вы хотите, чтобы дисплей состояния отображал последнее отправленное сообщение - используйте поток, который включает код вашего вопроса (без сна), и сохраните последнюю полную строку как последнюю строку из Arduino .
Обновление: пример кода mtasic
неплох, но если Arduino отправил частичную строку при вызове inWaiting ()
, вы получите усеченную строку. . Вместо этого вы хотите поместить последнюю полную строку в last_received
, и сохраните частичную строку в буфере
, чтобы ее можно было добавить в следующий раз в цикле. Примерно так:
def receiving(ser):
global last_received
buffer_string = ''
while True:
buffer_string = buffer_string + ser.read(ser.inWaiting())
if '\n' in buffer_string:
lines = buffer_string.split('\n') # Guaranteed to have at least 2 entries
last_received = lines[-2]
#If the Arduino sends lots of empty lines, you'll lose the
#last filled line, so you could make the above statement conditional
#like so: if lines[-2]: last_received = lines[-2]
buffer_string = lines[-1]
Относительно использования readline ()
: Вот что говорится в документации Pyserial (слегка отредактировано для ясности и с упоминанием readlines ()):
Будьте осторожны при использовании «строка чтения». Делать указать тайм-аут при открытии последовательный порт, иначе он может заблокировать навсегда, если нет символа новой строки получили. Также обратите внимание, что "readlines ()" работает только с таймаутом. Это зависит от тайм-аута и интерпретирует это как EOF (конец файла).
что кажется мне вполне разумным!
Вам понадобится цикл для чтения всего отправленного, с блокировкой последнего вызова readline () до истечения времени ожидания. Итак:
def readLastLine(ser):
last_data=''
while True:
data=ser.readline()
if data!='':
last_data=data
else:
return last_data
from serial import *
from threading import Thread
last_received = ''
def receiving(ser):
global last_received
buffer = ''
while True:
# last_received = ser.readline()
buffer += ser.read(ser.inWaiting())
if '\n' in buffer:
last_received, buffer = buffer.split('\n')[-2:]
if __name__ == '__main__':
ser = Serial(
port=None,
baudrate=9600,
bytesize=EIGHTBITS,
parity=PARITY_NONE,
stopbits=STOPBITS_ONE,
timeout=0.1,
xonxoff=0,
rtscts=0,
interCharTimeout=None
)
Thread(target=receiving, args=(ser,)).start()
Незначительная модификация кода mtasic и Виная Саджипа:
Хотя я нашел этот код весьма полезным для меня для аналогичного приложения, мне потребовались все строки, возвращаемые из последовательное устройство, которое будет периодически посылать информацию.
Я решил вытащить первый элемент сверху, записать его, а затем снова соединить оставшиеся элементы в качестве нового буфера и продолжить оттуда.
Я понимаю, что это
1115285] не то, о чем просил Грег, но я подумал, что стоит поделиться в качестве примечания.
def receiving(ser):
global last_received
buffer = ''
while True:
buffer = buffer + ser.read(ser.inWaiting())
if '\n' in buffer:
lines = buffer.split('\n')
last_received = lines.pop(0)
buffer = '\n'.join(lines)