pyserial - Как считать последнюю строку, отправленную от последовательного устройства

Хорошо я не соглашаюсь с Вашим комментарием по поводу репликации. Можно запустить репликацию путем создания базы данных с нуля, и можно управлять или обновлениями, будет сделан путем обновления доступной клиентской базы данных или просто воссоздания базы данных.

Автоматизированная репликация упростит Вашу работу автоматически руководящими ключами и отношениями.

я думаю, что самая легкая вещь сделать состоит в том, чтобы запустить репликацию моментальных снимков через Studio Сервера MSSQL, получить T-SQL соответствующие сценарии (т.е. соответствующие инструкции T-SQL и для публикации и для подписок), и записать эти сценарии как часть задания в списке Jobs SQL Agent или как задача репликации в папке репликаций.

19
задан Seanny123 15 March 2015 в 15:52
поделиться

4 ответа

Возможно, я неправильно понимаю ваш вопрос, но поскольку это последовательная линия, вам придется читать все, что отправлено из 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 (конец файла).

что кажется мне вполне разумным!

29
ответ дан 30 November 2019 в 02:09
поделиться

Вам понадобится цикл для чтения всего отправленного, с блокировкой последнего вызова readline () до истечения времени ожидания. Итак:

def readLastLine(ser):
    last_data=''
    while True:
        data=ser.readline()
        if data!='':
            last_data=data
        else:
            return last_data
2
ответ дан 30 November 2019 в 02:09
поделиться
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()
11
ответ дан 30 November 2019 в 02:09
поделиться

Незначительная модификация кода 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)
2
ответ дан 30 November 2019 в 02:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: