之前做了一個物聯網小項目,需要打通單片機與服務器。單片機的數據要傳輸到雲服務器上。我的打算是單片機串口傳輸到本地計算機,本地計算機再傳輸到雲mysql服務器。可以做這個事情的有很多語言,因為之前剛好學了python,所以我選擇用python讀取單片機傳到本地計算機的串口數據,並將串口數據過濾后格式化存儲到雲端的mysql數據庫上。以下是代碼部分。
1 #create by Feng 2 # coding=UTF-8 3 import serial 4 import pymysql 5 import datetime 6 7 def clean_spaces(s): #過濾掉換行符和空格 8 s = s.replace('\r', '') 9 s = s.replace('\t', '') 10 s = s.replace('\f', '') 11 s = s.replace('\n', '') 12 return s 13 14 def transp_bytes(b): 15 barr = bytearray(b) 16 str = barr.decode() 17 return str 18 19 def mySplit(s, ds): 20 res = [s] 21 # 循環所有的分割符 22 for d in ds: 23 t = [] 24 # 一定要list 一下才能正確使用 25 res2 = list(map(lambda x: t.extend(x.split(d)), res)) 26 # print(res2) 27 res = t 28 # 過濾掉空字串 29 return [x for x in res if x] #返回一個list 30 #用法:r = mySplit(s1, 'C%L') 31 # print('r', r) 32 33 db = pymysql.connect('數據庫ip',user = "數據庫用戶名",passwd = "數據庫密碼",db = "數據庫名") # 打開數據庫連接 34 cursor = db.cursor() #獲取數據庫游標 35 serial = serial.Serial('COM3', 19200) #設置串口和波特率 36 print(serial) 37 if serial.isOpen(): #開啟串口 38 print("open success") 39 else: 40 print("open failed") 41 42 try: 43 temp = '1' 44 humi = '23' 45 light = '0' 46 date="1111" 47 n = 0 48 #sql = "insert into serial(temp,humi,light) values ('"+temp+"','"+humi+"','"+light+"')" 49 while True: 50 count = serial.inWaiting() 51 if count > 0: 52 data = serial.read(count) #接收串口 53 #a = data 54 data = clean_spaces(transp_bytes(data)) #過濾換行、回車 55 li = [] 56 li = mySplit(data,'C%L') #字符分割 57 time = datetime.datetime.now().strftime('%Y%m%d%H%M%S') #獲取時間 58 try: #異常處理 59 sql= "insert into serial(temp,humi,light,time) values ('"+li[0]+"','"+li[1]+"','"+li[2]+"','"+time+"')" 60 #print("indexError,but do worry!") 61 cursor.execute(sql) 62 cursor.connection.commit() #提交 63 print("three data was gain") #數據上傳成功 64 except IndexError: 65 print("indexError,but do worry") 66 except KeyboardInterrupt: 67 if serial != None: 68 serial.close()