前言:之所以把本文的名字起得这么长是为了突出文中包涵的每一部分。如题,文中程序正是包涵了读取串口、网络编程、文本处理与文件操作。这是我们项目的数据处理的一部分,因为项目也不涉及保密,也不是什么核心技术,所以写出来分享一下并没有什么不妥之处。这百行级别的代码都是亲手敲的,一边学习、查询然后再编程,实现了串口接收数据的处理和自动化录入文件,对提高了数据处理的效率。会的东西越多,做事就越简单。
程序说明: 脚本按行处理串口数据,串口数据设置的是一行一行的发送,也就是说是以“\r\n”结尾的。脚本分为客户端和服务器端:客户端读取串口,处理数据,发送数据,写入本地文件。服务器端接收数据,写入文件。
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()
Client端:
# -*- 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\tTemperature\tHuminity\tBattery\tSO2ppm\tNO2ppm\tO3ppm\tCOppm\n"
titleugm3 = "Time\tTemperature\tHuminity\tBattery\tSO2ugm3\tNO2ugm3\tO3ugm3\tCOmgm3\n"
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()+'\t'+line[13:18].strip()+'\t'+line[22:28]+\
'\t'+line[32:39]+'\t'+line[43:50]+'\t'+line[54:61]+'\t'+line[65:72]
line_ppm = cut_line
if len(line) == 74:
SO2_ppm = float(line[32:39].replace('\x00',''))
NO2_ppm = float(line[43:50].replace('\x00',''))
O3_ppm = float(line[54:61].replace('\x00',''))
CO_ppm = float(line[65:72].replace('\x00',''))
else:
continue
line_ugm3 = line[4:9]+'\t'+line[13:18]+'\t'+line[22:28]+'\t'+ ("%.3f"%(64/24.45*1000*SO2_ppm))+\
'\t'+("%.3f"%(46/24.45*1000*NO2_ppm))+'\t'+("%.3f"%(48/24.45*1000*O3_ppm))+\
'\t'+("%.3f"%(28/24.45*CO_ppm))
print "%s" % line_ppm+'\n'
fppm.write(currentTime + '\t' + line_ppm+'\n')
fppm.flush()
s.sendall(currentTime + '\t' + line_ppm+'\n')#网络发送
#print "%r" % line_ugm3+'\t'+Weather_Condition+'\n'
print "%s" % line_ugm3+'\n'
fugm3.write(currentTime + '\t' + line_ugm3+'\n')
fugm3.flush()
s.sendall(currentTime + '\t' + line_ugm3+'\n')#网络发送
else:
break
ser.close()
fppm.close()
fugm3.close()