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()





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章