2016-10-29 12 views
0

この問題を解決するにはいくつかのスレッドがありますが、この特定の問題についてはまだ見ていません。Python 3でPySerialを使用して連続的にバイトを送信

私はPython 3.5でPySerialライブラリを使用していますが、プログラムは0〜2G(ギガ)の範囲の整数値のみを含むcsvファイルを送信します。つまり、各整数値は1〜4バイトです。

ビルトインのPython bin()関数は、送信される整数のバイナリSTRING表現を私に与えるためにうまく動作します。次に、残りの文字列のint()値を送信するために、文字列の先頭にある "0b"を削除できます。私が実行している問題は、Pyserialのwrite()関数です。

write()関数はシーケンス(bytesarray、bytesなど)のみを受け入れます。 bytesarray()にバイナリ値をキャストすると、バイナリ値の各桁の値の配列(0-256)が返されますが、これは私が望むものではありません。

どのようなタイプのエンコードを行っても、Herculesでは各ビットがバイトとして送信されていることがわかります。たとえば、

16進値を送信しようとすると同じ問題が発生します。だから私の質問は、どのようにPyserialのライブラリを使用してバイナリデータを真のバイトとして送信するのかです。

私の問題が明確でない場合は、私に知らせてください。私は明確にしようとします。基本的に、最終的な結果は次のようになります。

00001000 results in 1 bytes being sent. 
Terminal: {08} 

私はそれが私がやりたい作ることができるかどうかを確認するために書き込み()の定義にいくつかの調整をしたが、私はすべての主要なを作るためのpythonで十分習熟していませんよ変更。ここで元の定義される:

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' 

は、これらのいずれかを送信し、その後longにもう一方の側に4つのバイトを読み取ります。

+0

私はそれがうまくいったと信じています。ありがとうございました。構造体ライブラリに関するドキュメント:[Python Docs](https://docs.python.org/2/library/struct.html) – InterestingGuy

関連する問題