1. #!/usr/bin/python
  2. # -*-coding: utf-8 -*-
  3.  
  4. import serial
  5. import threading
  6. import binascii
  7. from datetime import datetime
  8. import struct
  9. import csv
  10.  
  11. class SerialPort:
  12. def __init__(self, port, buand):
  13. self.port = serial.Serial(port, buand)
  14. self.port.close()
  15. if not self.port.isOpen():
  16. self.port.open()
  17.  
  18. def port_open(self):
  19. if not self.port.isOpen():
  20. self.port.open()
  21.  
  22. def port_close(self):
  23. self.port.close()
  24.  
  25. def send_data(self):
  26. self.port.write('')
  27.  
  28. def read_data(self):
  29. global is_exit
  30. global data_bytes
  31. while not is_exit:
  32. count = self.port.inWaiting()
  33. if count > 0:
  34. rec_str = self.port.read(count)
  35. data_bytes=data_bytes+rec_str
  36. #print('当前数据接收总字节数:'+str(len(data_bytes))+' 本次接收字节数:'+str(len(rec_str)))
  37. #print(str(datetime.now()),':',binascii.b2a_hex(rec_str))
  38.  
  39. serialPort = 'COM6' # 串口
  40. baudRate = 115200 # 波特率
  41. is_exit=False
  42. data_bytes=bytearray()
  43.  
  44. if __name__ == '__main__':
  45. #打开串口
  46. mSerial = SerialPort(serialPort, baudRate)
  47.  
  48. #文件写入操作
  49. filename=input('请输入文件名:比如test.csv:')
  50. dt=datetime.now()
  51. nowtime_str=dt.strftime('%y-%m-%d %I-%M-%S') #时间
  52. filename=nowtime_str+'_'+filename
  53. out=open(filename,'a+')
  54. csv_writer=csv.writer(out)
  55.  
  56. #开始数据读取线程
  57. t1 = threading.Thread(target=mSerial.read_data)
  58. t1.setDaemon(True)
  59. t1.start()
  60.  
  61. while not is_exit:
  62. #主线程:对读取的串口数据进行处理
  63. data_len=len(data_bytes)
  64. i=0
  65. while(i<data_len-1):
  66. if(data_bytes[i]==0xFF and data_bytes[i+1]==0x5A):
  67. frame_code=data_bytes[i+2]
  68. frame_len=struct.unpack('<H',data_bytes[i+4:i+6])[0]
  69. frame_time=struct.unpack('<I',data_bytes[i+6:i+10])[0]
  70. print('帧类型:',frame_code,'帧长度:',frame_len,'时间戳:',frame_time)
  71. #print(frame_code,frame_len,frame_time)
  72. if frame_code==0x03: #判断帧类型
  73. #struct 解析数据帧
  74. accelerated_x,accelerated_y,accelerated_z,angular_x,angular_y,angular_z,tem,speed_x,speed_y,speed_z,\
  75. angular_v_x,angular_v_y,angular_v_z=struct.unpack('<fffffffffffff',data_bytes[i+12:i+12+frame_len-6])
  76. dt=datetime.now()
  77. nowtime_str=dt.strftime('%y-%m-%d %I:%M:%S') #时间
  78. loc_str=[nowtime_str,frame_time,accelerated_x,accelerated_y,accelerated_z,angular_x,angular_y,angular_z,tem,speed_x,speed_y,speed_z,\
  79. angular_v_x,angular_v_y,angular_v_z]
  80.  
  81. #写入csv文件
  82. try:
  83. csv_writer.writerow(loc_str)
  84. except Exception as e:
  85. raise e
  86. i=i+6+frame_len+3
  87. else:
  88. i=i+1
  89. data_bytes[0:i]=b''

代码简介:本代码主要用来处理陀螺仪发送过来的串口数据,主线程用struct模块对串口数据进行解析,用csv模块对解析出来的数据进行保存,子线程用来进行读取串口数据,并将数据以字节流的方式存储到全局变量data_bytes

笔记:

struct模块,用于解析字节流

binascii模块,用于十六进制形式的显示

bytearray.fromhex():将十六进制字符串转为字节数组

python 下串口数据的读取,解析,和保存-的更多相关文章

  1. python接口自动化测试--数据分离读取Excal指定单元格数据

    上一篇博客讲了怎么批量读取Excal单元格数据,现在咱们说一下怎么读取Excal指定单元格数据. 一.首先建一个Test_Main类 #!/usr/bin/python # -*- coding: U ...

  2. Python实现CSV数据的读取--两种方法实现

    方法一: 方法二:

  3. Python下Mysql数据连接池——单例

    # coding:utf-8 import threading import pymysql from DBUtils.PooledDB import PooledDB from app.common ...

  4. C#SerialPort如何读取串口数据并显示在TextBox上

    SerialPort中串口数据的读取与写入有较大的不同.由于串口不知道数据何时到达,因此有两种方法可以实现串口数据的读取.一.线程实时读串口:二.事件触发方式实现. 由于线程实时读串口的效率不是十分高 ...

  5. python 3下对stm32串口数据做解析

    1.最近有个想做一个传感器数据实时显示的上位机,常规的数据打印太频繁了,无法直观的看出数据的变化. python下的上位机实现起来简单一点,网上找了一些python界面Tkinter相关资料和pyth ...

  6. json进阶(一)js读取解析JSON类型数据

    js读取解析JSON类型数据 一.什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式,同 ...

  7. Linux下串口編程遇到的接收数据错误及原因(0x0d,0x11接收错误)

    摘要:Linux下串口编程遇到的接收数据错误及原因 来源:https://dotblogs.com.tw/k/2012/07/24/73572 近日在调试串口的时候发现,另一设备向我ARM板的串口发送 ...

  8. FFMPEG内存操作(一) avio_reading.c 回调读取数据到内存解析

    相关博客列表 : FFMPEG内存操作(一) avio_reading.c 回调读取数据到内存解析 FFMPEG内存操作(二)从内存中读取数及数据格式的转换 FFmpeg内存操作(三)内存转码器 在F ...

  9. Python 下JSON的两种编解码方式实例解析

    概念   JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写.在日常的工作中,应用范围极其广泛.这里就介绍python下它的两种编解码方法: ...

随机推荐

  1. 【sicily】 1934. 移动小球

    Description 你有一些小球,从左到右依次编号为1,2,3,...,n. 你可以执行两种指令(1或者2).其中, 1 X Y表示把小球X移动到小球Y的左边, 2 X Y表示把小球X移动到小球Y ...

  2. (2)dotnet开源电商系统-brnshop VS nopCommerce(dotnet两套电商来PK--第二篇:代码从哪开始-BrnMall3.0Beta)

    看大牛们的源码,对于水平一般的人,还是略微有点难度的.我从我自身读码的亲身体验,写下杂散片语,希望能和大家一同进步,也为了日后记忆上的备查. 先看的是brnMall的源码结构,从哪看起呢? 首先推荐看 ...

  3. cocos creator 底部按钮touch延迟

    cocos论坛里有这个问题: http://forum.cocos.com/t/ios-touchstart-bug/63367我的引擎版本:"engine_version": & ...

  4. 验证:java 主线程在子线程结束后才会结束

    package com.idealisan.test; /** * Hello world! * */ public class App { public static void main( Stri ...

  5. eas之缓存清理

    apusic缓存清理,安装web框架补丁后,先清空apusic缓存,然后再重启服务apusic-domains-server1-deploy-easweb-tmpfiles

  6. eas之action的创建

    protected KDWorkButton btnFileManage;   protected ActionFileManage actionFileManage = null;      pub ...

  7. java获取当前日期的前一天,前一月和前一年

    核心:使用Calendar的add(int field, int amount)方法 Calendar ca = Calendar.getInstance();//得到一个Calendar的实例 ca ...

  8. [IOI2007]矿工配餐

    状态是f[i][a][b][c][d]表示第i个餐车,1号矿洞最近两顿是a,b,2号矿洞最近两顿是c,d. 给的空间是16MB,滚动数组滚动了第一维就行了 (给的变量是char是因为这个不超过256, ...

  9. Django-xadmin+rule对象级权限的实现

    原文:https://blog.csdn.net/zcyuefan/article/details/77743380 1. 需求vs现状 1.1 需求要求做一个ERP后台辅助管理的程序,有以下几项基本 ...

  10. DBMS_SPACE包的使用

    最近有朋友问到了DBMS_SPACE包的使用,也看了一下,大部分是关于dbms_space.space_usage的使用,space_usage这个过程的例子已经很多了,我也就不再多说了,除了这个过程 ...