2016-10-29 5 views
0

Там несколько потоков, которые я просматривал по этим адресам, аналогичные проблемы, но еще не видели каких-либо конкретных проблем.Отправить байтовое серийное использование 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 

ответ

0
>>> struct.pack('<I', 1234567) 
b'\x87\xd6\x12\x00' 
>>> struct.pack('>I', 1234567) 
b'\x00\x12\xd6\x87' 

Отправить один из них, а затем прочитать 4 байта на другой стороне в long.

+0

Я считаю, что сработало красиво. Спасибо. Документация по библиотеке структуры: [Документы Python] (https://docs.python.org/2/library/struct.html) – InterestingGuy