当前位置: 首页 > 编程日记 > 正文

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

相关文章:

《深入理解计算机系统》第八章——异常控制流知识点总结

课本习题&#xff1a; 8.11 #include <unistd.h> #include <stdio.h>int main(){int i;for(i0;i<2;i) fork();printf("hello\n");exit(0);}/** Result:* hello* hello* hello* hello*/ 8.12 #include <stdio.h> #include <unistd.h>vo…

vs2003复制一个web窗体,没有更改指向同一个cs 文件,引发大问题

今天我在原来的考试系统的出题模块中,input模块,因为增加的一个web窗体编译有问题,于是就复制了原来的启动项页面input,再改了名字为set1,然后在set1页面上删除了控件和代码,再把set1设置为启动项,谁知道问题出来了:因为两个aspx文件都是指向同一个CS文件&#xff0c;从他们的H…

8.29 对象?数组?

今天发现我的filter函数有问题&#xff0c;翻不了页&#xff0c;一直报错&#xff1a; 这是一个封装好的Array原型扩展函数。 /* Array 原型方法扩展 */(function() {$.extend(Array.prototype, {// 添加内容&#xff0c;比push多一个检查相同内容部分add: function(item) {if …

Nginx的作用

1、Nginx简介&#xff1a; 2、简介&#xff1a; Nginx是一个高性能的HTTP和反向代理服务器。 支持的操作系统众多&#xff0c;windows、linux、MacOSX 可实现负载均衡 Rewrite功能强大 电商架构大部分都采用NginxTomcat的架构 3、命令行使用&#xff1a; 三个命令&#xff1a;(…

(转)TabContainer要实现服务器端回传

TabContainer要实现服务器端回传,出来在后台实现 OnActiveTabChanged 事件外, 还需要在前台实现 OnClientActiveTabChanged 事件&#xff0c;这是关键。 <asp:UpdatePanel ID"UpdatePanel1"runat"server"ChildrenAsTriggers"true"><con…

python 获取脚本所在目录

pythonsys.path__file__abspathrealpath 平时写python经常会想获得脚本所在的目录&#xff0c;例如有个文件跟脚本文件放在一个相对的目录位置&#xff0c;那就可以通过脚本文件的目录找到对应的文件&#xff0c;即使以后脚本文件移到其他地方&#xff0c;脚本也基本不需要改动…

《深入理解计算机系统》第十章——系统级I/0

目录 10.1Unix I/O 10.2文件 10.3打开和关闭文件 10.4读和写文件 10.5用RIO包建壮地读写 10.6读取文件元数据 10.7读取目录内容 10.8共享文件 10.9 I/O重定向 10.10 标准I/O 10.1Unix I/O 在Linux中&#xff0c;一切皆为文件。 文件I/O函数-------打开文件、读文件…

终于完成了“微软”化

整整忙活了一个下午&#xff0c;基本上我的笔记本完成了可怕的“微软”化进程&#xff01;是的&#xff0c;当我完成FOXMAIL中邮件向OUTLOOK2007的迁移后&#xff0c;在办公层面&#xff0c;已经完成“微软”化了。其实真的不想这样&#xff0c;但是想MS在独霸桌面后&#xff0…

C#创建Windows服务

利用VS.NET创建C# Windows服务在很多应用中需要做windows服务来操作数据库等操作&#xff0c;比如 &#xff08;1&#xff09;一些非常慢的数据库操作&#xff0c;不想一次性去做&#xff0c;想慢慢的通过服务定时去做&#xff0c;比如定时为数据库备份等 &#xff08;2&#x…

《深入理解计算机系统》第七章——链接知识点总结

目录 7.1编译器驱动程序 7.2静态链接 7.3目标文件 7.4可重定位目标文件 7.5符号和符号表 7.6符号解析 • 静态库(.a archive files) 7.1编译器驱动程序 7.2静态链接 7.3目标文件 7.4可重定位目标文件 使用readelf -S查看hello.o 一个典型的ELF可重定位目标文件包含以下…

排序算法之直接插入排序

1、基本思想&#xff1a; 已知待排序列r[1...n],先将序列中的第一个记录看成是一个有序的子序列&#xff0c;然后从第二个记录起逐个进行插入&#xff0c;直至整个序列变成关键字非递减有序序列为止。 具体操作如下&#xff1a; &#xff08;1&#xff09;查找出r[i]在有序序列…

【代码片段】如何使用CSS来快速定义多彩光标

对于web开发中&#xff0c;我们经常都看得到需要输入内容的组件和元素&#xff0c;比如&#xff0c;textarea&#xff0c;或者可编辑的DIV(contenteditable) &#xff0c;如果你也曾思考过使用相关方式修改一下光标颜色的&#xff0c;那么这篇技术小分享&#xff0c;你绝对不应…

如何划分155MSDH带宽

我们单位拟计划租用运营商155MSDH电路&#xff0c;由于我们单位应用业务较多&#xff0c;为了避免各业务之间相互影响&#xff0c;更好地分享带宽&#xff0c;根据各业务数据量的大小&#xff0c;分别赋予一定的带宽&#xff0c;使各业务在自己的带宽内传输&#xff0c;但不知选…

慕课袁春风老师《计算机系统基础》一二三部分练习题

2.2 1、下列几种存储器中&#xff0c;&#xff08; A &#xff09;是易失性存储器。 A. cache B. EPROM C. Flash Memory D. CD-ROM 2、下面有关半导体存储器组织的叙述中&#xff0c;错误的是&#xff08; D &#xff09;。 A. 存储器的核心部分是存储阵列&#xff0c;…

47种常见的浏览器兼容性问题大汇总

浏览器兼容性问题大汇总 JavaScript 31. HTML对象获取问题 32. const问题 33. event.x与event.y问题 34. window.location.href问题 35. frame问题 36. 模态和非模态窗口问题 37. firefox与IE的父元素(parentElement)的区别 38. document.formName.item(”itemName”) 问题 39.…

封装了一下我佛山人4.0 (支持vs2005)asp.net 页面验证

第一次写控件&#xff0c;拿“我佛山人4.0”开个刀&#xff0c;实际上也不算是什么控件&#xff0c;只是封装了一下&#xff0c;方便在asp.net中使用。 建议先看“我佛山人 4。0”文档。 声明&#xff1a;控件中参考了不少网上的源码&#xff0c;大家不要觉得眼熟BS人啊。注&am…

九章算法班L8 Array Number

转载于:https://www.cnblogs.com/sissie-coding/p/10295478.html

linux密码时效更改方法

密码时效 按目前的形势&#xff0c;已有更强大的硬件大大地缩短了利用自动运行的程序来猜测密码的时间。因此在UNIX系统中防止密码被***的别一方法就是要经常地改变密码。很多时候&#xff0c;用户却不改变密码。因此一种机制用来强制规律性的更改密码是合乎要求的。这种技术称…

YOLOv10训练自己的数据集

至此,整个YOLOv10的训练预测阶段完成,与YOLOv8差不多。欢迎各位批评指正。

安卓相对布局常用语句

不BB写在自己博客园看的舒服 RelativeLayout布局 android:layout_marginTop"25dip" //顶部距离 android:gravity"left" //空间布局位置 android:layout_marginLeft"15dip //距离左边距 // 相对于给定ID控件 android:layout_above 将该控件的底部置于…

Tomcat V6 Examples移植到Apusic V5.1

目标&#xff1a;将Tomcat V6的的例子Examples移植到Apusic V5.1上术语&#xff1a;Tomcat&#xff1a;只提供了WEB容器的开源服务器&#xff1b;Apusic&#xff1a;提供了完整的J2EE支持的商用服务器&#xff1b;%TOMCAT_HOME%&#xff1a;Tomcat安装目录%APUSIC_HOME%&#x…

Android 活动与活动间数据传递--登录注册页面

AndroidManifest.xml: <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"package"com.example.myapplica…

使用SVG中的Symbol元素制作Icon

前言 随着大屏幕分辨率的普及以及各种移动设备层出不穷的移动互联网时代的到来&#xff0c;我们在网站设计时更应该关心内容在各种设备上的阅读性和显示效果。我们都希望能在任何时间&#xff0c;任何设备上都能清楚的&#xff0c;高效的传递信息给用户。 而随着各种高清视网膜…

【JOURNAL】恭喜发财

刚写完上一条blog不久&#xff0c;南京城里开始响彻了鞭炮声&#xff0c;人见人爱、极具亲和力的财神来了。上海的一个朋友发短信来说那个国际化大都市也被对财神的膜拜感染得热闹喧天。这是好的。昨天给老婆表亲家的孩子压岁钱&#xff0c;对方说免了吧&#xff0c;我坚持让他…

[树形dp] Jzoj P5233 概率博弈

Description 小A和小B在玩游戏。这个游戏是这样的&#xff1a;有一棵n个点的以1为根的有根树&#xff0c;叶子有权值。假设有m个叶子&#xff0c;那么树上每个叶子的权值序列就是一个1->m 的排列。一开始在1号点有一颗棋子。两人轮流将这颗棋子移向其当前位置的一个儿子。假…

ASP.NET获取IP的6种方法

服务端&#xff1a; //方法一HttpContext.Current.Request.UserHostAddress; //方法二HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];//方法三stringstrHostName System.Net.Dns.GetHostName();stringclientIPAddress System.Net.Dns.GetHostAddresse…

软件工程实践第一次作业

准备篇 一、回想一下你初入大学时对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的&#xff1f; 在读到博文B时&#xff0c;博客B[1]的作者说道&#xff1a;“ 那时&#xff0c;对其他学校认知的匮乏让自己无助起来&#xff0c;最后的抉择&#xff0c;是希望选择一个…

VC 6.0不老

最近做的几个项目&#xff0c;客户都是要求使用Vc 6开发&#xff0c;我用的是VC 6.0 Sp6。VC 6 装上插件之后发现使用方便多了&#xff0c;下面是转载[url]http://hi.baidu.com/linuxtoys/blog/item/5f4251a9f12a53fd1e17a272.html[/url] 的一篇关于VC6的小插件的文章&#xff…

[03] 处理注解:反射

1、AnnotatedElement接口如果没有用来读取注解的方法和工作&#xff0c;那么注解也就不会比注释更有用处了。使用注解的过程中&#xff0c;很重要的一部分就是创建于使用注解处理器。Java SE5扩展了反射机制的API&#xff0c;以帮助程序员快速的构造自定义注解处理器。Java用An…