python 3下对stm32串口数据做解析
1、最近有个想做一个传感器数据实时显示的上位机,常规的数据打印太频繁了,无法直观的看出数据的变化。
python下的上位机实现起来简单一点,网上找了一些python界面Tkinter相关资料和python串口的demo.测试实现了简单的数据显示。
Mark 一下问题点:
最大的问题点在于对bytes型数据的拼接:之前的串口解析的代码是在python 2.7平台上实现的,
切换到python3.0之后,测试失踪无法通过。幸而找到了大神相助。
python 2.7code:
1 import os 2 import time 3 import sys, traceback 4 from serial.serialutil import SerialException 5 from serial import Serial 6 7 import struct 8 import binascii 9 10 11 class Arduino: 12 def __init__(self, port="/dev/ttyUSB0", baudrate=115200, timeout=0.5): 13 14 self.port = port 15 self.baudrate = baudrate 16 self.timeout = timeout 17 self.encoder_count = 0 18 self.writeTimeout = timeout 19 self.interCharTimeout = timeout / 30. 20 21 self.WAITING_FF = 0 22 self.WAITING_AA = 1 23 self.RECEIVE_LEN = 2 24 self.RECEIVE_PACKAGE = 3 25 self.RECEIVE_CHECK = 4 26 self.HEADER0 = 0xff 27 self.HEADER1 = 0xaa 28 self.REC_CMD = 5 29 self.count = 0 30 self.data1 = 0 31 self.data2 = 0 32 self.error_flag = 0 33 self.SUCCESS = 0 34 self.FAIL = -1 35 36 self.receive_state_ = self.WAITING_FF 37 self.receive_check_sum_ = 0 38 self.payload_command = '' 39 self.payload_ack = '' 40 self.payload_args = '' 41 self.payload_len = 0 42 self.byte_count_ = 0 43 self.receive_message_length_ = 0 44 45 self.mutex = threading.Thread.allocate_lock() 46 47 # An array to cache analog sensor readings 48 self.analog_sensor_cache = [None] * self.N_ANALOG_PORTS 49 50 # An array to cache digital sensor readings 51 self.digital_sensor_cache = [None] * self.N_DIGITAL_PORTS 52 53 def connect(self): 54 try: 55 print "Connecting to Arduino on port", self.port, "..." 56 self.port = Serial(port=self.port, baudrate=self.baudrate, timeout=self.timeout, writeTimeout=self.writeTimeout) 57 # The next line is necessary to give the firmware time to wake up. 58 time.sleep(1) 59 state_, val = self.get_baud() 60 if val != self.baudrate: 61 time.sleep(1) 62 state_, val = self.get_baud() 63 if val != self.baudrate: 64 raise SerialException 65 print "Connected at", self.baudrate 66 print "Arduino is ready." 67 68 except SerialException: 69 print "Serial Exception:" 70 print sys.exc_info() 71 print "Traceback follows:" 72 traceback.print_exc(file=sys.stdout) 73 print "Cannot connect to Arduino!" 74 os._exit(1) 75 76 def open(self): 77 self.port.open() 78 79 def close(self): 80 self.port.close() 81 82 def send(self, cmd): 83 self.port.write(cmd) 84 85 def receiveFiniteStates(self, rx_data): 86 if self.receive_state_ == self.WAITING_FF: 87 #print str(binascii.b2a_hex(rx_data)) 88 if rx_data == '\xff': 89 self.receive_state_ = self.WAITING_AA 90 self.receive_check_sum_ =0 91 self.receive_message_length_ = 0 92 self.byte_count_=0 93 self.payload_ack = '' 94 self.payload_args = '' 95 self.payload_len = 0 96 self.count = 0 97 98 elif self.receive_state_ == self.WAITING_AA : 99 if rx_data == '\xaa': 100 self.receive_state_ = self.REC_CMD 101 else: 102 self.receive_state_ = self.WAITING_FF 103 elif self.receive_state_ == self.REC_CMD: 104 self.count+=1 105 if self.count == 1: 106 self.data1,=struct.unpack("B",rx_data) 107 elif self.count == 2: 108 self.data2,=struct.unpack("B",rx_data) 109 self.receive_state_ = self.RECEIVE_LEN 110 if self.error_flag == 0 and self.data1 != 0: 111 self.error_flag = 1 112 if self.data2 != 0 and self.error_flag == 0: 113 self.error_flag = 1 114 elif self.receive_state_ == self.RECEIVE_LEN: 115 self.receive_message_length_, = struct.unpack("B",rx_data) 116 self.receive_state_ = self.RECEIVE_PACKAGE 117 elif self.receive_state_ == self.RECEIVE_PACKAGE: 118 if self.byte_count_==0: 119 self.payload_ack = rx_data 120 else: 121 self.payload_args += rx_data 122 self.byte_count_ +=1 123 #print "byte:"+str(byte_count_) +","+ "rece_len:"+str(receive_message_length_) 124 if self.byte_count_ >= self.receive_message_length_: 125 self.receive_state_ = self.RECEIVE_CHECK 126 127 elif self.receive_state_ == self.RECEIVE_CHECK: 128 #if(rx_data == (unsigned char)receive_check_sum_) 129 if 1: 130 self.receive_state_ = self.WAITING_FF 131 #print str(binascii.b2a_hex(value)) 132 #left, right, = struct.unpack('hh', value) 133 #print "left:"+str(left)+", right:"+str(right) 134 return 1 135 else: 136 self.receive_state_ = self.WAITING_FF 137 else: 138 self.receive_state_ = self.WAITING_FF; 139 return 0 140 141 def recv(self, timeout=0.5): 142 timeout = min(timeout, self.timeout) 143 ''' This command should not be used on its own: it is called by the execute commands 144 below in a thread safe manner. Note: we use read() instead of readline() since 145 readline() tends to return garbage characters from the Arduino 146 ''' 147 c = '' 148 value = '' 149 attempts = 0 150 c = self.port.read(1) 151 #print str(binascii.b2a_hex(c)) 152 while self.receiveFiniteStates(c) != 1: 153 c = self.port.read(1) 154 #print str(binascii.b2a_hex(c)) 155 attempts += 1 156 if attempts * self.interCharTimeout > timeout: 157 return 0 158 return 1 159 160 def recv_ack(self): 161 ack = self.recv(self.timeout) 162 return ack == 'OK' 163 164 def execute(self, cmd): 165 self.mutex.acquire() 166 167 try: 168 self.port.flushInput() 169 except: 170 pass 171 172 ntries = 1 173 attempts = 0 174 175 try: 176 self.port.write(cmd) 177 res = self.recv(self.timeout) 178 while attempts < ntries and res !=1 : 179 try: 180 self.port.flushInput() 181 self.port.write(cmd) 182 res = self.recv(self.timeout) 183 except: 184 print "Exception executing command: " + str(binascii.b2a_hex(cmd)) 185 attempts += 1 186 except: 187 self.mutex.release() 188 print "Exception executing command: " + str(binascii.b2a_hex(cmd)) 189 return 0 190 191 self.mutex.release() 192 return 1 193 194 def get_baud(self): 195 ''' Get the current baud rate on the serial port. 196 ''' 197 cmd_str=struct.pack("4B", self.HEADER0, self.HEADER1, 0x01, 0x00) + struct.pack("B", 0x01) 198 if (self.execute(cmd_str))==1 and self.payload_ack == '\x00': 199 val, = struct.unpack('I', self.payload_args) 200 return self.SUCCESS, val 201 else: 202 return self.FAIL, 0 203 204 def get_check_sum(self,list): 205 list_len = len(list) 206 cs = 0 207 for i in range(list_len): 208 #print i, list[i] 209 cs += list[i] 210 cs=cs%255 211 return cs 212 213 def stop(self): 214 ''' Stop both motors. 215 ''' 216 self.drive(0, 0)
View Code
在python 3.6 version 中就该修改部分代码:
问题在于bytes类型的拼接:
以下的拼接是正确的:
bytes('','ascii')+bytes([1,2,3,4,5,6,7,8,9])bytes('','ascii')+bytes([1,2,3,4,5,6,7,8,9])+bytes([1,2,3,4,5,6,7,8,9])
也即是:bytes类型的拼接的初始变量要声明为:bytes('','ascii')
如果声明为其它类型:比如字符串,执行时会直接报错。
即:python2.7代码块中:40行以及94行的声明:
(1)将:40行和94行的 self.payload_args = '' 改为: self.payload_args = bytes('','ascii') (2)将:121行赋值命令: self.payload_args += rx_data 修改为: self.payload_args += bytes(rx_data)
View Code
源码已上传到github:链接
目前单纯实现了串口数据的查询:
转载于:https://www.cnblogs.com/sshbit/p/10283185.html
python 3下对stm32串口数据做解析相关推荐
- Ardunio下的STM32串口通信
文章目录 任务要求 Ardunio下的STM32串口通信 软件准备 编译烧录 标准库函数与HAL库函数的stm32编程方式差异 国人版的MCU集成开发平台 stduino IDE 总结 任务要求 安装 ...
- 关于python读取Arduino发送的串口数据将bytes转换为str问题
关于python读取Arduino发送的串口数据将bytes转换为str问题 Arduino作为一款非常好的开源软件,在控制领域十分受欢迎.最近在做一件事就是将Arduino的数据通过串口传输到电脑, ...
- windows下C++读取串口数据
windows下C++读取串口数据 这里提供一个类: SerialPort.h #pragma once #ifndef SERIALPORT_H_ #define SERIALPORT_H_ #in ...
- 你关注的房子降价了吗?Python分析下北京的二手房数据
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:CDA数据分析师 对于许多在一线城市打拼的人群而言,能够在大城市安家 ...
- STM32 —— 串口数据接收
STM32 -- 串口接收数据 我们已经在前面的博客中讲过了串口通信中发送数据和中断的一些基本原理,这里主要介绍串口接收数据的相关内容 定长字符串的接收 当接收单字节时,我们就可以使用最简单的接收方式 ...
- 树莓派3b接收USB串口数据并解析处理
通过树莓派3b使用wiringPi接收串口数据,并对帧头帧尾进行判断,解析出符合帧协议的数据. 1. 帧头.帧尾.帧长度定义 我们在这里定义串口数据的帧头为 0x3A 0x3B,帧尾为 0x7E 0x ...
- 换晶振导致stm32串口数据飞码的解决办法(补充)
今天(2014.4.21)把stm32f107的程序下载到stm32f103的板子上,发现串口收不到数据,突然想起晶振频率没有修改,#define HSE_VALUE ((uint32_t)13 ...
- python gui界面制作显示串口数据_python实现串口通讯小程序(GUI界面)
python实现串口通讯小程序(GUI界面) 使用python实现串口通讯需要使用python的pyserial库来实现,这个库在安装python的时候没有自动进行安装,需要自己进行安装. 1.安装p ...
- 换晶振导致stm32串口数据飞码的解决办法
一般来说,stm32f107都是用标配的晶振,比如8MHz. 但是,如果用别的晶振,比如13.56M的晶振,那串口接收还正常吗? 根据试验结果,很可能会飞码.比如说用串口助手发送的是0x35,但是在串 ...
最新文章
- R语言关联规则挖掘数据集预览、分析、筛选:项目数的分布形态(分位数、密度图)、itemFrequency函数统计每一项目在所有事务中出现的次数、最常发生的项目、数据筛选(交易的集合项目大于1)
- 华夏幸福发布2018年业绩简报 整体销售面积同比增57.56%
- oracle12c无法访问em精简版,Oracle12C的EM无法访问怎么办?
- 究竟该不该“勃”!!!
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)
- [].slice.call(arguments)模拟实现 Array.of
- 2016年深圳市宝安区小一学位申请流程及时间安排
- uva 11997 K Smallest Sums 优先队列处理多路归并问题
- C# WPF MVVM开发框架Caliburn.Micro 名称Transformer⑩①
- python中级水平_python 初级/中级/高级/核心
- java map遍历删除_HashMap的各种遍历和删除方式总结
- python 协程 多线程_python进阶之多线程(简单介绍协程)
- Mac文件系统下的chmod修改权限r w x分别是什么意思
- 你没听过的IT技术解读,能秒懂的都是老司机...
- HyperX Savage系列 DDR3 2400 16GB (8GBx2)玩虚拟化部署
- matlab中fft与fftshift,在matlab中使用fft,ifft和fftshift
- 射频芯片ATE测试从入门到放弃之基本概念
- JavaScript模板引擎
- html添加省市县联动下拉框,JS实现省市县三级下拉联动
- Python高级编程第2版_张亮 阿信(译)_人民邮电出版社_2017-10_v2_完整版
热门文章
- 使用Uboot启动内核并挂载NFS根文件系统
- 《BI项目笔记》用Excel2013连接和浏览OLAP多维数据集
- sqlserver查询一个表的字段信息
- mysql中change用法,mysql 中alter的用法以及一些步骤
- vtk相机_C#开发PACS医学影像三维重建(一)使用VTK重建3D影像
- php pdo 中文乱码,php pdo oracle中文乱码的快速解决方法
- uml图中的各种箭头_设计模式学习笔记(二):UML与面向对象设计原则
- 搜狗输入法电脑版_搜狗输入法小米版升级简介
- 链接mysql_使用python链接mysql及redis(缓存型数据库)
- LabVIEW跳转访问网页