使おうとしたら USBシリアル変換器のドライバーがないって言われた。メーカーのページからダウンロード&インストール、Windows10 64bit でデバイスマネージャからドライバの
インストール、ハードウェア変更のスキャン で使えるようになった。 COM3
しかし、Windows10でUSBシリアルを使うのはややこしい。適当に検索して試すと動くのは動いた。うむむ。
VCP のインストールが必要とか、難しすぎて説明が書けない。再起動したら使えたりとか、わからん
さて pyserial に戻って、モジュール名は pyserial だが、import するのは serial
serial.Serial(ポート名、速度)でオープンして、with なんとかだと要らないが、そのままやるとcloseが必要。
書き方は、オブジェクト指向言語的に
with serial.Serial(port, 9600, timeout=1) as ser: とか 【 : と次の字下げに注意】
ser = serial.Serial(port, 9600, timeout=1) とか。
時刻をいれるために、time モジュールを使う(フォーマットは C言語系でOKのようだ)
受け取ったデータが空でなければ、時刻を付けて出力とすると、以下のようなものになる(と思う)。
import serial
import time
port='COM4'
format='%Y/%m/%d %H:%M:%S'
with serial.Serial(port, 9600, timeout=1) as ser:
ser.write(b"Bytes data\r\n")
while True:
data=ser.readline()
if(data==b''):
continue
else:
t1=time.strftime(format, time.localtime())
print(t1, data)
これを、ウィンドウズパワーシェルから python プログラム名 として、
クロスケーブルでつないだ、別のPC (こっちは、Teratermで接続)とすると、
送った "Byte data\r\n" が先方に出力され、先方のPCで入力した文字がこちらに表示された。参考にしたページのいくつかは以下
try:
やること
except:
file.close()
で、Ctrl+C で抜けて、ファイルを保存して無事に終わるという動作になるようだ。
また、跡で使わない制御文字 STX などを、捨ててしまうのには以下のような処理
import unicodedata
def remove_control_characters(s):
return "".join(ch for ch in s if unicodedata.category(ch)[0]!="C")
>> https://note.nkmk.me/python-str-extract/ >> >> スライスで文字列を抽出 >> >> [start:step]とすると、start <= x < >> stopの範囲の文字列が抽出できる。上述のインデックスと同じく0始まり。startを省略すると先頭から、endを省略すると末尾までの範囲となる。 >> >> >> インデックスと同様、負の値も使える。 >> >> バイト列でもできる( https://qiita.com/tanuk1647/items/276d2be36f5abb8ea52e )
import serial
import time
import csv
import unicodedata
import os
def remove_control_characters(s):
return "".join(ch for ch in s if unicodedata.category(ch)[0]!="C")
# DATADIR='PWD10'
DATADIR='PWD'
EXT='.csv'
# serial open for PWD10
ser=serial.Serial(port='COM3',baudrate=9600,bytesize=7,parity='E', timeout=1)
# set time format in data file
format='%Y/%m/%d %H:%M:%S'
# for filename
# format2='%Y%m%d%H%M' # every min
format2='%Y%m%d%H' # every hour
# format2='%Y%m%d' # every day
# 前のデータファイルの名前用変数の初期化
filename2=''
print('Dir ', DATADIR, ' ?')
if not os.path.exists(DATADIR):
os.mkdir(DATADIR)
try:
while True:
t2=time.strftime(format2, time.localtime())
# filename=DATADIR+t2+EXT
filename = os.path.join(DATADIR,t2)+EXT
# print(filename)
if(filename!=filename2):
if(filename2!=''):
file.close()
file=open(filename,'a',newline='\n')
filename2=filename
writer = csv.writer(file)
# ser.write(b"Bytes data\r\n")
data=ser.readline()
if(data==b''):
continue
else:
print('Data are written into ', filename)
t1=time.strftime(format, time.localtime())
#非文字データ削除 (視程計」)
line = t1 + ' ' + remove_control_characters(data.strip().decode('UTF=8'))
print(line)
lines = line.split(' ')
writer.writerow(lines)
file.flush()
except:
file.close()
上のコード, シンプルにファイルに記録するだけ (無保証です)