Pythonシリアル通信の実現
シリアル通信とは、外部設定とコンピュータ間で、データ信号線、アース線、制御線などを通じて、ビットごとにデータを転送する通信方式のことです。このような通信方式ではデータ線が少なく、遠距離通信では通信コストが節約できるが、パラレル伝送より伝送速度が低い。シリアルポートはコンピュータ上の非常に一般的な機器通信プロトコルです。pyserialモジュールはpythonのクロストークへのアクセスをカプセル化しており、マルチプラットフォームの利用に統一したインターフェースを提供している。
インストール:
2つのCH 340(TTLシリアルポートモジュール)はPCシリアルポートに接続され、Pythonを介してデータインタラクションを行う。
簡単なシリアルプログラムの実現:
その中でデータを読むパッケージ方法はあまり良くないです。使うとまた循環的に受信しなければならないので、かえって複雑になります。
https://pythonhosted.org/pyserial/pyserial_appi.舸serial.Serial.open
以上はPythonシリアル通信の実現の詳細です。pythonシリアル通信に関する資料は他の関連記事に注目してください。
インストール:
pip3 install pyserial
テスト:2つのCH 340(TTLシリアルポートモジュール)はPCシリアルポートに接続され、Pythonを介してデータインタラクションを行う。
簡単なシリアルプログラムの実現:
import serial #
try:
# ,GNU / Linux / dev / ttyUSB0 Windows COM3
portx="COM3"
# , :50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200
bps=115200
# ,None: ,0 , ( )
timex=5
# ,
ser=serial.Serial(portx,bps,timeout=timex)
#
result=ser.write(" ".encode("gbk"))
print(" :",result)
ser.close()#
except Exception as e:
print("--- ---:",e)
利用可能なシリアルリストを取得:
import serial #
import serial.tools.list_ports
port_list = list(serial.tools.list_ports.comports())
print(port_list)
if len(port_list) == 0:
print(' ')
else:
for i in range(0,len(port_list)):
print(port_list[i])
16進数の処理:
import serial #
try:
portx="COM3"
bps=115200
# ,None: ,0 , ( )
timex=None
ser=serial.Serial(portx,bps,timeout=timex)
print(" :", ser)
#
result=ser.write(chr(0x06).encode("utf-8"))#
print(" :",result)
#
print(ser.read().hex())#
print("---------------")
ser.close()#
except Exception as e:
print("--- ---:",e)
他の詳細を追加:
import serial #
try:
# ,GNU / Linux / dev / ttyUSB0 Windows COM3
portx="COM3"
# , :50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200
bps=115200
# ,None: ,0 , ( )
timex=5
# ,
ser=serial.Serial(portx,bps,timeout=timex)
print(" :", ser)
print(ser.port)#
print(ser.baudrate)#
result=ser.write(" ".encode("gbk"))#
print(" :",result)
#print(ser.read())#
# print(ser.read(10).decode("gbk"))#
#print(ser.readline().decode("gbk"))#
#print(ser.readlines())# , , (timeout)
#print(ser.in_waiting)#
#print(ser.out_waiting)#
# , ,
while True:
if ser.in_waiting:
str=ser.read(ser.in_waiting ).decode("gbk")
if(str=="exit"):#
break
else:
print(" :",str)
print("---------------")
ser.close()#
except Exception as e:
print("--- ---:",e)
部分パッケージ:その中でデータを読むパッケージ方法はあまり良くないです。使うとまた循環的に受信しなければならないので、かえって複雑になります。
import serial #
import threading
STRGLO="" #
BOOL=True #
#
def ReadData(ser):
global STRGLO,BOOL
# , ,
while BOOL:
if ser.in_waiting:
STRGLO = ser.read(ser.in_waiting).decode("gbk")
print(STRGLO)
#
# ,GNU / Linux / dev / ttyUSB0 Windows COM3
# , :50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200
# ,None: ,0 , ( )
def DOpenPort(portx,bps,timeout):
ret=False
try:
# ,
ser = serial.Serial(portx, bps, timeout=timeout)
#
if(ser.is_open):
ret=True
threading.Thread(target=ReadData, args=(ser,)).start()
except Exception as e:
print("--- ---:", e)
return ser,ret
#
def DColsePort(ser):
global BOOL
BOOL=False
ser.close()
#
def DWritePort(ser,text):
result = ser.write(text.encode("gbk")) #
return result
#
def DReadPort():
global STRGLO
str=STRGLO
STRGLO=""#
return str
if __name__=="__main__":
ser,ret=DOpenPort("COM6",115200,None)
if(ret==True):#
count=DWritePort(ser," , ")
print(" :",count)
#DReadPort() #
#DColsePort(ser) #
すべてのシリアルを見る
import serial.tools.list_ports
port_list = list(serial.tools.list_ports.comports())
if len(port_list) == 0:
print(' ')
else:
for i in range(0,len(port_list)):
print(port_list[i])
参考:https://pythonhosted.org/pyserial/pyserial_appi.舸serial.Serial.open
以上はPythonシリアル通信の実現の詳細です。pythonシリアル通信に関する資料は他の関連記事に注目してください。