Там несколько потоков, которые я просматривал по этим адресам, аналогичные проблемы, но еще не видели каких-либо конкретных проблем.Отправить байтовое серийное использование PySerial в Python 3
Я использую библиотеку PySerial в Python 3.5, и программа передает файл csv, содержащий только целочисленные значения в диапазоне 0 -> 2G (giga), что означает, что каждое целочисленное значение может быть от 1 до 4 байтов.
Встроенная функция bin() Python прекрасно работает, чтобы дать мне двоичное представление STRING целого числа, которое должно быть передано. Затем я могу удалить «0b» в начале строки, чтобы передать значение int() оставшейся строки. Проблема, с которой я сталкиваюсь, связана с функцией write() Pyserial.
Функция write() принимает только последовательности (bytesarray, bytes и т. Д.). Если я передам двоичное значение в bytesarray(), он вернет массив значений (0-256) каждой цифры моего двоичного значения, чего я не хочу.
Когда я делаю кодировку любого типа, я вижу в Hercules, что каждый бит отправляется в виде байта. Например,
У меня такая же проблема, если я пытаюсь передать шестнадцатеричное значение. Поэтому мой вопрос: как я могу использовать библиотеку Pyserial для передачи своих двоичных данных в качестве истинного байта.
Если моя проблема не ясна, просто дайте мне знать, и я попытаюсь уточнить. По сути, конечный результат будет:
00001000 results in 1 bytes being sent.
Terminal: {08}
Я сделал несколько настроек для определения записи(), чтобы увидеть, если я мог бы сделать это делать то, что я хочу, но я не достаточно квалифицирован, с питоном, чтобы сделать какую-либо серьезное изменения. Вот оригинальное определение:
def write(self, data):
"""Output the given byte string over the serial port."""
if not self.is_open:
raise portNotOpenError
#~ if not isinstance(data, (bytes, bytearray)):
#~ raise TypeError('expected %s or bytearray, got %s' (bytes,type(data)))
# convert data (needed in case of memoryview instance: Py 3.1 io lib), ctypes doesn't like memoryview
data = to_bytes(data)
if data:
#~ win32event.ResetEvent(self._overlapped_write.hEvent)
n = win32.DWORD()
success = win32.WriteFile(self._port_handle, data, len(data), ctypes.byref(n), self._overlapped_write)
if self._write_timeout != 0: # if blocking (None) or w/ write timeout (>0)
if not success and win32.GetLastError() != win32.ERROR_IO_PENDING:
raise SerialException("WriteFile failed ({!r})".format(ctypes.WinError()))
# Wait for the write to complete.
#~ win32.WaitForSingleObject(self._overlapped_write.hEvent, win32.INFINITE)
win32.GetOverlappedResult(self._port_handle, self._overlapped_write, ctypes.byref(n), True)
if win32.GetLastError() == win32.ERROR_OPERATION_ABORTED:
return n.value # canceled IO is no error
if n.value != len(data):
raise writeTimeoutError
return n.value
else:
errorcode = win32.ERROR_SUCCESS if success else win32.GetLastError()
if errorcode in (win32.ERROR_INVALID_USER_BUFFER, win32.ERROR_NOT_ENOUGH_MEMORY,
win32.ERROR_OPERATION_ABORTED):
return 0
elif errorcode in (win32.ERROR_SUCCESS, win32.ERROR_IO_PENDING):
# no info on true length provided by OS function in async mode
return len(data)
else:
raise SerialException("WriteFile failed ({!r})".format(ctypes.WinError()))
else:
return 0
Я считаю, что сработало красиво. Спасибо. Документация по библиотеке структуры: [Документы Python] (https://docs.python.org/2/library/struct.html) – InterestingGuy