python读取串口、网络编程、文本处理与文件操作
**前言:**之所以把本文的名字起得这么长是为了突出文中包涵的每一部分。如题,文中程序正是包涵了读取串口、网络编程、文本处理与文件操作。这是我们项目的数据处理的一部分,因为项目也不涉及保密,也不是什么核心技术,所以写出来分享一下并没有什么不妥之处。这百行级别的代码都是亲手敲的,一边学习、查询然后再编程,实现了串口接收数据的处理和自动化录入文件,对提高了数据处理的效率。会的东西越多,做事就越简单。
**程序说明:**脚本按行处理串口数据,串口数据设置的是一行一行的发送,也就是说是以“ ”结尾的。脚本分为客户端和服务器端:客户端读取串口,处理数据,发送数据,写入本地文件。服务器端接收数据,写入文件。
Server端:
import socket #导入socket模块
import time
import datetime
import sys
#定义函数显示时间,用于创建文件时写入文件名
def file_time():
str = time.strftime("%Y-%m-%d")
return str
#获得当前时间的字符串变量
fileCreateTime = file_time()
#打开文件,如果没有文件就创建后打开,文件名为:fileCreateTime+"ServerRecvugm3UnitsData.txt",
打开方式为:‘a’即追加,不删除文件中内容。
##############网络通信服务器端初始化###################
s = socket.socket() # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 1234 # 设置端口号
s.bind((host,port)) # 绑定端口
s.listen(5) # 等待客户端连接
#说明:绑定端口( address必须是一个双元素元组,((host,port)),主机名或者ip地址+端口号。如果端口号正在被使用或者保留,或者主机名或ip地址错误,则引发socke.error异常。)
#五步骤:对象,主机名,端口号,绑定,监听
####################################################
c, addr = s.accept() # 建立客户端连接,被动接受TCP客
户端连接,(阻塞式)等待连接的到来
print "Got connection from", addr # 服务器端打印
c.sendall("Thank you for connecting") # 服务器发送到客户端,完整发送TCP数据,完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
while True: #故意设置的一直接受,除非强制退出
d = c.recv(1024)#接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
print d
fugm3.write(d)#写入文件
fugm3.flush()#立刻刷入文件
fs.close()
s.close()
# -*- coding: UTF-8 -*-
import time
import datetime
import serial
import urllib2
import re
import sys
import json
import socket
def desplay_time():
str = time.strftime("%Y-%m-%d %A %X %Z")
timeString = str[:-12]
return timeString
def file_time():
str = time.strftime("%Y-%m-%d")
return str
#创建文件和获得文件名字
fileCreateTime = file_time()
fppm = open(fileCreateTime+"ppmUnitsData.txt",'a')
fugm3 = open(fileCreateTime+"ugm3UnitsData.txt",'a')
#初始化文件内容列表,写入文件
titleppm = "Time Temperature Huminity Battery SO2ppm NO2ppm O3ppm COppm
"
titleugm3 = "Time Temperature Huminity Battery SO2ugm3 NO2ugm3 O3ugm3 COmgm3
"
fppm.write(titleppm)
fugm3.write(titleugm3)
########################网络通信部分########################
s = socket.socket() # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 1234 # 设置端口号,必须和服务器端的一直
s.connect(('172.25.31.191',port))#连接!此处IP为服务器的IP地址
print s.recv(1024) #打印接受到的字符串
########################串口初始化########################
ser = serial.Serial('com13',115200,timeout = 20 )
print ser.portstr
while True:
line = ser.readline() #按行读取串口数据
if line:
currentTime = desplay_time()
print currentTime
cut_line = line[4:9].strip()+' '+line[13:18].strip()+' '+line[22:28]+
' '+line[32:39]+' '+line[43:50]+' '+line[54:61]+' '+line[65:72]
line_ppm = cut_line
if len(line) == 74:
SO2_ppm = float(line[32:39].replace('',''))
NO2_ppm = float(line[43:50].replace('',''))
O3_ppm = float(line[54:61].replace('',''))
CO_ppm = float(line[65:72].replace('',''))
else:
continue
line_ugm3 = line[4:9]+' '+line[13:18]+' '+line[22:28]+' '+ ("%.3f"%(64/24.45*1000*SO2_ppm))+
' '+("%.3f"%(46/24.45*1000*NO2_ppm))+' '+("%.3f"%(48/24.45*1000*O3_ppm))+
' '+("%.3f"%(28/24.45*CO_ppm))
print "%s" % line_ppm+'
'
fppm.write(currentTime + ' ' + line_ppm+'
')
fppm.flush()
s.sendall(currentTime + ' ' + line_ppm+'
')#网络发送
#print "%r" % line_ugm3+' '+Weather_Condition+'
'
print "%s" % line_ugm3+'
'
fugm3.write(currentTime + ' ' + line_ugm3+'
')
fugm3.flush()
s.sendall(currentTime + ' ' + line_ugm3+'
')#网络发送
else:
break
ser.close()
fppm.close()
fugm3.close()