python读取串口、网络编程、文本处理与文件操作

前言:之所以把本文的名字起得这么长是为了突出文中包涵的每一部分。如题,文中程序正是包涵了读取串口、网络编程、文本处理与文件操作。这是我们项目的数据处理的一部分,因为项目也不涉及保密,也不是什么核心技术,所以写出来分享一下并没有什么不妥之处。这百行级别的代码都是亲手敲的,一边学习、查询然后再编程,实现了串口接收数据的处理和自动化录入文件,对提高了数据处理的效率。会的东西越多,做事就越简单。
程序说明: 脚本按行处理串口数据,串口数据设置的是一行一行的发送,也就是说是以“\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()





  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值