python模块安装、串口操作、字节转换、exe生成、CRC计算
背景: 第一次采用python制作小工具,已安装版本2.7.9的python; 1.pyCharm license注册问题 采用License server, license server address:(http://xidea.online) 2.pyCharm下调试 在文件下新建项目,然后再新建文件,就可以使用集成调试了; 3.串口操作--外部包 可通过在cmd下直接运行:pip install pyserial 4.crc效验---外部包 可通过windows下cmd运行:pip install crcmod 5.byte与ASCII码转化--内部包binascii 6.python生成EXE---外部包PyInstaller 7.串口操作API用法 (1)打开串口 API---Serial("COM19",115200) [注意]:这边有看到第一个参数有人写0(对应COM1),但提示输入错误,要求输入字符串类型,输入‘0‘依然不行; (2)读操作 API---read(n) 需要提前知道返回字符串长度 返回str API---readline() 读取一行,以OA 或者OD结束 返回str,str里面的值为ASCII码的字符形式,比如0X30需要写成‘3‘;对其处理,需要转化成十六进制; API---readlines() 读取多行, 返回list 还有其它方案说是配合: API---inwaiting() 返回接收的字符串长度,再把这个值给read()来读取出来; 测试没成功; API---readall() 测试没成功; (3)写操作 API---write(data) data为str,str里面的值为ASCII码的字符形式的,比如0X33需要写成‘3‘;方法后面介绍; 8.byte转化为ASCII API---unhexlify(data) 将byte型(16进制的值);转化为ASCII字符形式的,如0X33代表字符‘3‘;用于组包后将数据转化为字符型,再传输; API--hexlify(data) 将ASCII字符数据,转化为byte(十六进制形式的),比如将接收的数据,进行处理后,再进行其它后续处理,如crc效验等; 9.crc效验 API--mkCrcFun(0x11021,rev=False,initCrc=0x0000,xorOut=0x0000) 0x11021代表CRC-16 XMODEM(X16+X12+X5+1) 例子: crc16_Xmodem = crcmod.mkCrcFun(0x11021,rev=False,initCrc=0x0000,xorOut=0x0000) readFun = ‘68020000‘ readCrcOUT = hex(crc16_cmodem(unhexlify(readFun))) 输出来的值为0x1234之类的,str类型 10.PyInstaller python下将py文件编译成exe形式的方式有两种:PyInstaller和py2exe; 安装方式:cmd下输入:pip install PyInstaller (1)操作方式 在存放.py的文件夹下打开当前路径的cmd,然后pyinstaller -F 文件.py [注意]: 1.pip install PyInstaller中千万要注意大小写,看了网上很多都是pyinstaller,然后一直安装不成功; pip install py2exe依然没有装成功; 2.关于PyInstaller和py2exe两者的比较,说是,用py2exe会在生成exe的文件夹里同时生产一堆文件,PyInstaller只会生成一个; 另一方面:说是,py2exe对32位或者64位的相互支持不好,32位上生产的到64位上有可能不能用;我用的PyInsataller,在32位上生产, 64位上也可用; 3.PyInstaller区分32位和64位,安装和python位制一致的即可; 4.关于是否需要将用到的模块拷贝到 .py的目录下 网上有人说需要放置在一起,我尝试了没有放置在一起,依然可以 11.字符串的处理 (1)截取部分 data = data[:-4] #将最后4个干掉 data = data[2:4] #获取字符串中的第3和第4个 (2)替换 data = data.replace(‘需要被替换的内容‘,‘替换前者的内容‘) [技巧]: 1.检测模块是否安装成功:模块安装完成后,可在cmd下输入python,再import 模块名,看看是否安装成功; 2.检测API返回值类型:print(type()) 3.CRC模块算出来的值可以通过工具(CRC Calculator 图标是算盘)进行效验下 代码: 声明:没有做封装,也没有注意写法和命令等,纯粹为了实现功能和学习用;
# -*- coding:UTF-8 -*- from serial import * from binascii import * from crcmod import * import time # def crc16Cal(x): # a = 0x0000 # b = 0x1021 # for byte in x: # a ^= ord(byte) # a <<= 8 # for i in range(8): # a <<= 1 # last = a & 0x8000 # if last == 1: # a ^= b # s = hex(a) # return s[4:6]+s[2:4] readFun = ‘68020000‘ crc16_cmodem = crcmod.mkCrcFun(0x11021,rev=False,initCrc=0x0000,xorOut=0x0000) readCrcOUT = hex(crc16_cmodem(unhexlify(readFun))) readCrcOUT = readCrcOUT[2:4]+readCrcOUT[4:6] print(readCrcOUT) readFun += readCrcOUT print(readFun) readFun = unhexlify(readFun) ser = Serial("COM19",115200) print(readFun) ser.write(readFun) data = ser.read(58) data =hexlify(data) print(data) data = data.replace(‘68023400‘,‘68033400‘) print(data) data = data[:-12] print(data) data += ‘03000000‘ print(data) readCrcOUT = hex(crc16_cmodem(unhexlify(data))) readCrcOUT = readCrcOUT[2:4]+readCrcOUT[4:6] print(readCrcOUT) data += readCrcOUT print(data) data = unhexlify(data) ser.write(data) #sleep time.sleep(2) #reset reset = ‘68010000‘ readCrcOUT = hex(crc16_cmodem(unhexlify(reset))) readCrcOUT = readCrcOUT[2:4]+readCrcOUT[4:6] reset += readCrcOUT reset = unhexlify(reset) ser.write(reset) ser.close()