1. ホーム
  2. Python

Python による pyserial 経由でのシリアルポートの読み取りと書き込み

2022-02-14 13:29:55

取得元:http://blog.csdn.net/xiaoxianerqq/article/details/50351632


Python 版のシリアルポートツールが共有されています: http://bbs.csdn.net/topics/390535101

apiの説明のためのドキュメント http://pythonhosted.org/pyserial/pyserial_api.html

  アクティブRFIDを使って資産管理プロジェクトに携わるニーズがあるため、カードリーダーのシリアルポートの内容を読み取るためにpythonを使う必要があります。そこで、使い勝手の良いpyserialモジュールをインストールし、共通機能を整理してみました


I.
Pythonを使ってシリアルポートを操作するためには、まず、関連するモジュールをダウンロードする必要があります。
1. パイシリアル ( http://pyserial.wiki.sourceforge.net/pySerial )
2. pywin32 ( http://sourceforge.net/projects/pywin32/ )

2,16進数表示

16進表示の本質は、受信した文字諸葛を対応するASCIIコードに変換し、そのASCII値を再び16進数に変換して特殊文字を表示することである。

ここでは、hexShow(argv)のように関数を定義しています。

  1. <スパン インポート  シリアル  
  2. <スパン デフ  hexShow(argv):  
  3.     結果 =  ''
  4.     hLen = len(argv)  
  5. について  i   xrange(hLen):  
  6.         hvol = ord(argv[i])  
  7.         hhex =  '%02x' hvol  
  8.         結果 += hhex+ ' '
  9. プリント 'hexShow:' 結果  
  10. <スパン
  11. t = serial.Serial( 'com12' , <スパン 9600 )  
  12. プリント  t.portstr  
  13. strInput = raw_input( 'いくつかの単語を入力してください:' )  
  14. n = t.write(strInput)  
  15. プリント  n  
  16. str = t.read(n)  
  17. プリント  スト  
  18. hexShow(str)  

================================================================================================================================== =


3,16進数で送信

16進数で送るとは、基本的には「' \xaa', ' \x0b' などの16進数形式の文字列を送ることです。ポイントは、文字列をどのように16進数に変換するかですが、これには2つの誤解があります。

1) 'ⅷ'+'aa'はエスケープバックスラッシュを含むのでダメです。

2) ' \x'+'aa' や r'\x'+'aa' もダメなので、印刷結果は \xaa でも変数に代入される値は '\xaa' となる。


 ここでは、デコード機能を使用しています。

  1. リスト 'aabbccddee'
  2. hexer=list.decode( ヘキサゴン )  
  3. プリント <スパン   ヘキサ  


注意点としては、文字列リストの長さが奇数の場合、デコードはエラーを報告します。文字列のスライス操作を使って、場合によっては文字列の先頭か末尾に「0」を追加してください

シリアルヘルパーが16進数で文字列 "abc" を送信する場合、pythonで次のようにします "self.l_serial.write("\x61x62x63") "。

もちろん、別のやり方もあります。

  1. strSerial =  "abc"
  2. strHex = binascii.b2a_hex(strSerial)  
  3. #print strHex
  4. strhex = strHex.decode()。 ヘックス )  
  5. #print strhex
  6. 自己 .l_serial.write(strhex)を実行します。  

同じ目的で実現できます。

というわけで、シリアル側は整理されました


<スパン <スパン

概要

このモジュールは、シリアルポートへのアクセスをカプセル化します。Windows, Linux, BSD (おそらくPOSIX準拠のシステム), Jython, IronPython (.NET, Mono) 上で動作するPythonのバックエンドを提供します。serial"という名前のモジュールは、自動的に適切なバックエンドを選択します。 
フリーソフトウェアライセンスで公開されています。  LICENSE.txt  をご覧ください。 
<スパン (C) 2001-2008 クリス・リヒティ  [email protected]
<スパン のことです。  SourceForgeのプロジェクトページ  で、こちらは  SVNリポジトリ  と、その  ダウンロードページ
<スパン ホームページは  http://pyserial.sf.net/
<スパン <スパン

特徴

  • すべてのサポート対象プラットフォームで同じクラスベースのインターフェイス
  • Python 2.2+のプロパティからポート設定にアクセスできます。
  • ポート番号は0から始まるので、ユーザプログラムでポート名を知る必要はない
  • 番号付けによるアクセスが不適切な場合は、ポート文字列(デバイス名)を指定することができます。
  • 異なるバイトサイズ、ストップビット、パリティ、RTS/CTSやXon/Xoffによるフロー制御のサポート 受信タイムアウトの有無に関係なく動作する ファイルライクなAPIで、"read" と "write" ("readline" 等もサポートされています)
  • 本パッケージに含まれるファイルは100%純粋なPythonです。Windows (pywin32) と Jython (JavaComm) では非標準ですが一般的なパッケージに依存します。POSIX (Linux, BSD) では、標準の Python ディストリビューションからのモジュールのみを使用します。)
  • ポートはバイナリ送信用に設定されています。NULLバイトのストリッピング、CR-LF変換などはありません。(POSIXでは何度も有効になっている。) このため、このモジュールは普遍的に有用なモジュールとなっている。

<スパン

必要条件

  • Python 2.2 以降
  • Windowsのpywin32拡張機能
  • Java Communications"(JavaComm)またはJava/Jython用互換エクステンション

<スパン

インストール方法


<スパン

ソースから

アーカイブからファイルを取り出し、そのディレクトリでシェル/コンソールを開き、Distutilsに残りの作業をさせます。 
python setup.py install 
ファイルは、"Lib/site-packages"ディレクトリにインストールされます。 
<スパン <スパン

イージーインストール

Python Package IndexからEGGが入手可能です。  http://pypi.python.org/pypi/pyserial
easy_install pyserial 
<スパン <スパン

Windowsインストーラー

また、エンドユーザー向けのWindowsインストーラーも用意されています。これは  ダウンロードページ
開発者の方は、サンプルやReadmeが含まれるソースアーカイブを入手するとよいでしょう。 
<スパン <スパン

簡単な紹介

ポート0を"9600,8,N,1"で開放、タイムアウトなし 
[テキスト]です。 表示プレーン コピー
  1. <スパン >>> インポートシリアル  
  2. >>> ser = serial.Serial(0) # 最初のシリアルポートを開く  
  3. >>> print ser.portstr # どのポートが本当に使われたかを確認する。  
  4. >>> ser.write("hello") # 文字列を書き込む  
  5. >>> ser.close() # ポートを閉じる  
19200,8,N,1"、1秒間のタイムアウトで指定されたポートを開く。 
[テキスト]です。 表示プレーン コピー
  1. >>> ser = serial.Serial('/dev/ttyS1',19200,timeout=1)を実行します。  
  2. >>> x = ser.read() # 1バイトの読み込み  
  3. >>> s = ser.read(10) # 10バイトまで読み込む(タイムアウト)  
  4. >>> line = ser.readline() # '\n' で終わる行を読み込む  
  5. >>> ser.close()  
2番目のポートをquot;38400,8,E,1"でオープン、ノンブロッキングHWハンドシェイク。 
[テキスト]です。 表示プレーン コピー
  1. >>> ser = serial.Serial(1, 38400, timeout=0,  
  2. ... パリティ=serial.PARITY_EVEN, rtscts=1)  
  3. >>> s = ser.read(100) # 100バイトまで読み込む  
  4. ...                         # あるいはバッファにあるだけの量  
Serialインスタンスを取得し、後で設定/オープンする 
[テキスト]です。 表示プレーン コピー
  1. >>> ser = serial.  
  2. >>> ser.baudrate = 19200  
  3. >>> ser.port = 0  
  4. >>> ser  
  5. <スパン Serial<id=0xa81c10, open=False>(port='COM1', baudrate=19200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=0, rtscts=1)  
  6. <スパン >>> ser.open()  
  7. >>> ser.isOpen()  
  8. 真  
  9. >>> ser.close()を実行します。  
  10. >>> ser.isOpen()  
  11. 偽  
readline"を使用する場合は注意が必要です。タイムアウトを指定しないと、改行文字を受信しない場合、永久にブロックされる可能性があります。ポートが正しく開かれていない場合は例外を発生させます。 
また、ソース配布物またはオンラインのexamplesディレクトリにあるサンプルファイルもご覧ください。 
<スパン <スパン

事例紹介

SVN リポジトリをご覧ください。サンプルディレクトリがあり、簡単なターミナルなどがあります。 
http://pyserial.svn.sourceforge.net/viewvc/pyserial/trunk/pyserial/examples/
<スパン <スパン

Serial クラスのパラメータ

[テキスト]をクリックします。 表示プレーン コピー
  1. ser = serial.Serial(  
  2. port=None, # デバイスの数、番号は以下から始まります。  
  3. # ゼロ。すべてが失敗した場合、ユーザーは  
  4. # デバイス文字列を指定することができます、注意  
  5. # これはもうポータブルではないこと  
  6. # ポートが指定されていない場合、未設定の  
  7. # 閉じたシリアルポートオブジェクトが作成される  
  8. baudrate=9600, # baud&