實現效果:Python端發送txt文件裏的數據
串口助手顯示接收到的數據
操作步驟如下:
1、先安裝Python的串口庫pyserial,安裝方法有很多種,以下的適用我的win10 64位。
將你電腦安裝的Python程序目錄放入系統的path路徑
點擊
下載,
然後隨便解壓到某個目錄下,
在這個目錄下按shift+右鍵空白處可以直接調出cmd,
然後在命令行輸入
python setup.py install
至此pyserial安裝完畢。
2、由於不想拍打印機的打印效果,也考慮到讀者不一定有打印機,所以我們用虛擬的串口工具短接一下,能接到數據顯示就可以了。
下載串口虛擬軟件
安裝完成後把Cracked文件夾裏的vspdconfig.exe和vspdctl.dll複製到安裝目錄後就可完成漢化破解。
打開
嘗試發送普通數據沒問題,發送沒問題,嘗試發送txt,代碼如下
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import serial
#打開串口
serialPort="COM2" #串口
baudRate=9600 #波特率
ser=serial.Serial(serialPort,baudRate,timeout=0.5)
print "參數設置:串口=%s ,波特率=%d"%(serialPort,baudRate)
CMD = open('./60mmx70mm的模板.txt')
print ("CMD:%s" % (CMD))
line = CMD.readline();
#收發數據
while line:
#str = raw_input("請輸入要發送的數據(非中文)並同時接收數據: ")
#ser.write((str+'\n').encode())
#print(ser.readline())#可以接收中文
ser.write(line)
print (line)
line=CMD.readline()
ser.close()
但是出現錯誤提示
IOError: [Errno 22] invalid mode ('r') or filename
確認已經將60mmx70mm的模板.txt文件放入該目錄下,百度說該原因是文件權限問題,嘗試如下改進
CMD = open('.//60mmx70mm的模板.txt')
還是同樣提示
考慮到文件中包含中文,所以需要增加
# -*- coding: cp936 -*- #2.7版本帶中文需要加該語句否則無法打印
該語句應該很關鍵,一定要在utf-8之前,完整代碼如下
#!/usr/bin/env python
# -*- coding: cp936 -*- #2.7版本帶中文需要加該語句否則無法打印
# -*- coding: utf-8 -*-
import serial
#打開串口
serialPort="COM2" #串口
baudRate=9600 #波特率
ser=serial.Serial(serialPort,baudRate,timeout=0.5)
print "參數設置:串口=%s ,波特率=%d"%(serialPort,baudRate)
CMD = open('.//60mmx70mm的模板.txt')
print ("CMD:%s" % (CMD))
line = CMD.readline();
#收發數據
while line:
#str = raw_input("請輸入要發送的數據(非中文)並同時接收數據: ")
#ser.write((str+'\n').encode())
#print(ser.readline())#可以接收中文
ser.write(line)
print (line)
line=CMD.readline()
ser.close()
效果如顯示,
2019年08月28日補充:
如果是Python3.0,要作出很多改變,比如需要將文件指定編碼格式來獲取字符串,發送時再用encode編碼爲gb2312的byte,如下:
```python
CMD = open('模板.txt', encoding='utf-8')
ser.write(line.encode('gb2312'))
```
這樣才能被打印機識別,2.7反倒不用,雖然2.7便利些,但在一些打印機字符需要指定特定編碼格式時它是無力的。
2019年08月26日補充:
txt文件編碼格式要先解碼,易混淆,推薦直接在代碼中寫打印指令
printCommand = [
'SIZE 70 mm,40 mm',
'GAP 3 mm,0',
'SPEED 5',
'DENSITY 5',
'DIRECTION 1',
'CLS',
'……',
'PRINT 3,1'
]
print("可將輸出作爲txt文件提供給開發:\r\n")
for i in printCommand:
print(i + "\r\n")
# 每條指令後面都要有\r\n
ser.write((i + "\r\n").encode('gb18030'))