#python #python-2.7 #type-conversion #concatenation #pyserial
#python #python-2.7 #тип-преобразование #Конкатенация #pyserial
Вопрос:
Я бы написал список на serial COM через pySerial.
Я создаю список строк, где каждая строка является параметром, а затем передаю список в функцию последовательной записи. Возникает ошибка, потому что я не могу записать список строк непосредственно в serial
Это мой код:
import datetime
import time
import sys
import serial
date = datetime.datetime.now()
dateStr = str(date.strftime('%d-%m-%Y'))
unixTime = int(time.time())
crc = str("1234")
packet = list()
packet.append('test')
packet.append(dateStr)
packet.append(unixTime)
packet.append('4')
packet.append('81')
packet.append('1')
packet.append('0')
packet.append('00.7')
packet.append('4')
packet.append('9')
packet.append('0')
packet.append('18.8')
packet.append('5')
packet.append('3')
packet.append('0')
packet.append('15.3')
packet.append('4')
packet.append('6')
packet.append('0')
packet.append('2')
packet.append('0')
packet.append('13')
packet.append('0')
packet.append('0')
packet.append('0')
packet.append('185.6')
# add semicolon between list elements
serialCOM.write(packet)
Есть ли способ объединить все элементы списка в список или bytearray?
Кроме того, мне нужно добавить точку с запятой между каждым элементом списка.
Спасибо за помощь!
Комментарии:
1. вы пробовали
';'.join(packet)
?2. Кроме того, в списке есть
.extend()
метод. Вместо того, чтобы писать несколько строк добавлений, просто используйтеpacket.extend(['4', '81', '1', '0'])
.3. Моя проблема касается элементов списка, которые содержат строку. Например, packet[0], packet [1], packet [2]. Я ищу способ преобразования списка в линейную строку, содержащую список.
Ответ №1:
Если вам нужен фактический объект bytearray, передайте список в конструктор bytearray.
serialCOM.write(bytearray(packet))
Обратите внимание, что unixTime
это не преобразуется в строку, поэтому вы должны сначала преобразовать ее.
Но то, что вы, вероятно, хотите (основываясь на комментарии о точках с запятой), — это просто объединить строки, используя метод join для строки, подобной этой:
# Force all items in the list to be strings
msg = ';'.join(map(str,packet))
serialCOM.write(msg)
Результат объединения тогда:
In[50]: ';'.join(map(str,packet))
Out[50]: 'test;17-10-2016;1476708605;4;81;1;0;00.7;4;9;0;18.8;5;3;0;15.3;4;6;0;2;0;13;0;0;0;185.6'
Комментарии:
1. Спасибо frmdstryr ! Это именно то, что я ищу! Еще один вопрос: строка msg должна начинаться с «0x02» и заканчиваться «0x03». Это байты STX и ETX. Буду ли я использовать bytearray для записи непечатаемых символов в serialCom? Могу ли я добавить 0x02 в байтовый массив, преобразовать и объединить сообщение и, наконец, добавить 0x03?
2. Да, вы можете создавать байты, используя ‘ x<hex>’, например. ‘x02’ и ‘ x03’.