9、监测数据采集物联网应用开发步骤(7)
监测数据采集物联网应用开发步骤(6)
串口(COM)通讯开发
本章节测试使用了 Configure Virtual Serial Port Driver虚拟串口工具和本人自写的串口调试工具,请自行baidu下载对应工具
在com.zxy.common.Com_Para.py中添加如下内容
#RS232串口通讯列表 串口号,波特率,数据位,索引(A,B,C,D区分),多串口分割符;
ComPortList = "" #linux参考:/dev/ttyS0,9600,8,0,A;/dev/ttyS1.9600,8,0,B windwows参考:COM1,9600,8,0;COM2,9600,8,2
#串口通讯全局变量hashtable <String, seria>串口索引---串口对象
htComPort = {}
在com.zxy.main.Init_Page.py中添加如下内容
@staticmethoddef Start_ComPort():iIndex = 0for temComPort in Com_Para.ComPortList.split(";"):iIndex = iIndex + 1temComPortInfo = temComPort.split(",") try:if len(temComPortInfo) == 5 and Com_Fun.GetHashTableNone(Com_Para.htComPort, temComPortInfo[4]) is None:temCD = ComDev(temComPortInfo[0], int(temComPortInfo[1]), int(temComPortInfo[2]), int(temComPortInfo[3]), iIndex)temCD.attPortName = temComPortInfo[4]Com_Fun.SetHashTable(Com_Para.htComPort, temComPortInfo[4], temCD)except Exception as e:print("com link error:COM"+temComPortInfo[0]+"==>" + repr(e)+"=>"+str(e.__traceback__.tb_lineno))finally:Pass
创建串口设备管理类com.zxy.comport.ComDev.py
#! python3
# -*- coding: utf-8 -
'''
Created on 2017年05月10日
@author: zxyong 13738196011
'''import datetime,threading,time,serial
from com.zxy.common.Com_Fun import Com_Fun
from com.zxy.adminlog.UsAdmin_Log import UsAdmin_Log
from com.zxy.common import Com_Para
from com.zxy.z_debug import z_debug#监测数据采集物联网应用--串口设备管理
class ComDev(z_debug): attIndex = 0attPort = 0attBaudrate = 9600attBytesize = 8attSerial = None#超时时间(秒) 为了验证测试效果,将时间设置为10秒attTimeout = 10#返回值attReturnValue = NoneattPortName = ""#特殊插件处理attProtocol = ""#回发数据attSendValue = None#线程锁attLock = threading.Lock()def __init__(self, inputPort,inputBaudrate,inputBytesize,inputparity,inputIndex):self.attPort = inputPortself.attBaudrate = inputBaudrateself.attBytesize = inputBytesizetemParity = "N"if str(inputparity) == "0": #无校验temParity = "N"elif str(inputparity) == "1": #偶校验temParity = "E"elif str(inputparity) == "2": #奇校验temParity = "O"elif str(inputparity) == "3":temParity = "M"elif str(inputparity) == "4":temParity = "S"self.attSerial = serial.Serial(port=self.attPort,baudrate=self.attBaudrate,bytesize=self.attBytesize,parity=temParity, stopbits=1)self.attSerial.timeout = self.attTimeoutself.attIndex = inputIndexself.OpenSeriaPort()#打开串口def OpenSeriaPort(self):try: if not self.attSerial.isOpen(): self.attSerial.open()t = threading.Thread(target=self.OnDataReceived, name="ComPortTh" + str(self.attIndex))t.start()uL = UsAdmin_Log(Com_Para.ApplicationPath,str("ComPortTh" + str(self.attIndex)))uL.SaveFileDaySub("thread") print("Open ComPortTh" + str(self.attIndex)+" COM:"+str(self.attSerial.port)+" "+Com_Fun.GetTimeDef()+" lenThreads:"+str(len(threading.enumerate())))return Trueexcept Exception as e:if str(type(self)) == "<class 'type'>":self.debug_in(self,repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息else:self.debug_in(repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息return Falsefinally:pass#关闭串口def CloseSeriaPort(self):try: if not self.attSerial.isOpen(): self.attSerial.close()return Trueexcept Exception as e:if str(type(self)) == "<class 'type'>":self.debug_in(self,repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息else:self.debug_in(repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息return Falsefinally:pass#发送数据无返回 def WritePortDataImmed(self,inputByte):try: if not self.attSerial.isOpen(): self.OpenSeriaPort()if self.attSerial.isOpen() and self.attLock.acquire(): self.attReturnValue = NonetemNumber = self.attSerial.write(inputByte)time.sleep(0.2)self.attLock.release()return temNumberelse:return 0except Exception as e:if str(type(self)) == "<class 'type'>":self.debug_in(self,repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息else:self.debug_in(repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息return -1#返回值为字节,带结束符 def WritePortDataFlag(self,inputByte,EndFlag):try: if not self.attSerial.isOpen(): self.OpenSeriaPort()if self.attSerial.isOpen() and self.attLock.acquire(): self.attReturnValue = NonetemNumber = self.attSerial.write(inputByte) starttime = datetime.datetime.now() endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.attTimeout)while (self.attReturnValue is None or self.attReturnValue[len(self.attReturnValue) - len(EndFlag):len(self.attReturnValue)] != EndFlag.encode(Com_Para.U_CODE)) and starttime <= endtime:starttime = datetime.datetime.now()time.sleep(0.2) self.attLock.release()return temNumberexcept Exception as e:if str(type(self)) == "<class 'type'>":self.debug_in(self,repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息else:self.debug_in(repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息return -1finally:pass#返回值为字节 def WritePortData(self,inputByte):try: if not self.attSerial.isOpen(): self.OpenSeriaPort()if self.attSerial.isOpen() and self.attLock.acquire(): self.attReturnValue = NonetemNumber = self.attSerial.write(inputByte) starttime = datetime.datetime.now() endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.attTimeout)while self.attReturnValue is None and starttime <= endtime:starttime = datetime.datetime.now()time.sleep(0.2) self.attLock.release()return temNumberexcept Exception as e:if str(type(self)) == "<class 'type'>":self.debug_in(self,repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息else:self.debug_in(repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息return -1finally:pass#接收数据 def OnDataReceived(self):try:while self.attSerial.isOpen():temNum = self.attSerial.inWaiting()if temNum > 0:if self.attReturnValue is None:self.attReturnValue = self.attSerial.read(temNum)else:self.attReturnValue = self.attReturnValue + self.attSerial.read(temNum)else:time.sleep(1)except Exception as e:if str(type(self)) == "<class 'type'>":self.debug_in(self, repr(e)+"=>"+str(e.__traceback__.tb_lineno))else:self.debug_in(repr(e)+"=>"+str(e.__traceback__.tb_lineno))self.attReturnValue = None
串口通讯测试案例MonitorDataCmd.py主文件中编写:
在该语句下添加
#串口配置参数Com_Para.ComPortList = "COM2,9600,8,0,A;COM4,9600,8,2,B"#串口连接初始化Init_Page.Start_ComPort()#测试串口数据发送和接收temCP2 = Com_Fun.GetHashTable(Com_Para.htComPort,"A")#获取串口2对象temCP4 = Com_Fun.GetHashTable(Com_Para.htComPort,"B")#获取串口4对象temByte1 = ("AABBCCDDVV").encode(Com_Para.U_CODE) #发送字符串转byte[]temByte2 = ("11223344KM").encode(Com_Para.U_CODE) #发送字符串转byte[]print("开始发送串口数据")temRec1 = temCP2.WritePortData(temByte1)#往串口2发送数据print("串口2发送数据长度:"+str(temRec1))strRec = ""if temCP2.attReturnValue != None:strRec = temCP2.attReturnValue.decode(Com_Para.U_CODE)#收到串口数据print("串口2收到数据值:"+strRec)temRec2 = temCP4.WritePortData(temByte2)#往串口4发送数据print("串口3发送数据长度:"+str(temRec2))strRec = ""if temCP4.attReturnValue != None:strRec = temCP4.attReturnValue.decode(Com_Para.U_CODE)#收到串口数据print("串口4收到数据值:"+strRec)
串口调试测试结果:
相关文章:

9、监测数据采集物联网应用开发步骤(7)
监测数据采集物联网应用开发步骤(6) 串口(COM)通讯开发 本章节测试使用了 Configure Virtual Serial Port Driver虚拟串口工具和本人自写的串口调试工具,请自行baidu下载对应工具 在com.zxy.common.Com_Para.py中添加如下内容 #RS232串口通讯列表 串口号,波特率,…...

微信小程序开发教学系列(9)- 小程序页面优化
第9章 小程序页面优化 在开发小程序时,页面性能优化是非常重要的一项任务。优化页面性能可以提升用户体验,使小程序更加流畅和高效。本章将介绍一些常见的页面优化方法和技巧,帮助您提升小程序的性能。 9.1 页面性能优化的基本原则 页面性…...

如何将储存在Mac或PC端的PDF文件传输到移动设备呢?
iMazing是一款iOS设备管理软件,用户借助它可以将iPad或iPhone上的文件备份到PC或Mac上,还能实现不同设备之间的文件传输,能很大程度上方便用户进行文件管理。 在阅读方面,iPad和iPhone是阅读PDF的优秀选择,相较于Mac或…...

一图看懂架构划分原则:技术划分 OR 领域划分?
架构划分原则 技术划分 描述: 按技术用途组织系统组件典型示例: 分层(多层)架构 组件按技术层组织 用户界面: 与用户直接交互的部分业务规则和核心处理: 逻辑和算法与数据库交互: 数据存取和查询数据库层: 数据存储和管理 优点: 当大部分更改与技术层次对齐时适用 缺点: 域更…...

从零开始的Hadoop学习(二)| Hadoop介绍、优势、组成、HDFS架构
1. Hadoop 是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。主要解决,海量数据的存储和海量数据的分析计算问题。广义上来说,Hadoop通常是指一个更广泛的概念—Hadoop生态圈。 2. Hadoop 的优势 高可靠性:Hadoop底层维护多…...

问道管理:逾4600股飘红!汽车板块爆了,多股冲击涨停!
A股商场今天上午全体低开,但其后逐级上行,创业板指数上午收盘大涨超越3%,北向资金也完成净买入38亿元。 别的,A股商场半年报成绩发表如火如荼进行中,多家公司发表半年报后股价应声大涨,部分公司股价冲击涨停…...

Java 语言实现选择排序算法
【引言】 选择排序算法是一种简单但有效的排序算法。它的原理是每次从未排序的元素中选择最小(或最大)的元素,放在已排序的末尾(或开头),逐渐形成有序序列。本文将使用Java语言实现选择排序算法,…...

【C语言每日一题】05. 输出保留12位小数的浮点数
题目来源:http://noi.openjudge.cn/ch0101/05/ 05 输出保留12位小数的浮点数 总时间限制: 1000ms 内存限制: 65536kB 问题描述 读入一个双精度浮点数,保留12位小数,输出这个浮点数。 输入 只有一行,一个双精度浮点数。 输出 …...

科大讯飞永久免费GPT入口来了!!!
讯飞GPT永久免费使用入口注册链接:讯飞星火认知大模型-AI大语言模型-星火大模型-科大讯飞。 登录讯飞账号后,点击进入体验。 进入体验页面后,选择景点推荐。 笔者让其写一篇关于讯飞GPT介绍的文案。 讯飞GPT是一款由讯飞公司推出的人工智能语…...

亚马逊反馈和评论的区别
在亚马逊上,"反馈"(Feedback)和"评论"(Review)是两个不同的概念,它们分别用于描述购买者与商品或卖家之间的不同方面。 1、反馈(Feedback): 亚马逊的…...

Linux 查看当前文件夹下的文件大小
1.直接查看: ll 或者 ls -la #查看文件大小,以kb为单位 ll#查看文件大小,包含隐藏的文件,以kb为单位 ls -la2.以 M 或者 G 为单位查看,根据文件实际大小进行合适的单位展示 du -sh *...

玩转 PI 系列-看起来像服务器的 ARM 开发板矩阵-Firefly Cluster Server
前言 基于我个人的工作内容和兴趣,想要在家里搞一套服务器集群,用于容器/K8s 等方案的测试验证。 考虑过使用二手服务器,比如 Dell R730, 还搞了一套配置清单,如下: Dell R7303.5 尺寸规格硬盘CPU: 2686v4*2 内存&a…...

《Flink学习笔记》——第六章 Flink的时间和窗口
6.1 时间语义 6.1.1 Flink中的时间语义 对于一台机器而言,时间就是系统时间。但是Flink是一个分布式处理系统,多台机器“各自为政”,没有统一的时钟,各自有各自的系统时间。而对于并行的子任务来说,在不同的节点&…...

nano主板扩大swap交换交换空间大小 /windows里远程传输文件/ssh远程登陆访问GUI界面报错
nano主板扩大swap交换交换空间大小 /windows里远程传输文件/ssh远程登陆访问GUI界面报错 1.扩容 在编译某些文件时由于nano主控内存空间小,在编译工作空间catkin_make时会卡住,因此需要扩容 sudo fallocate -l 13G /var/swapfile #1.新增swapfile 文…...

7个用于机器学习和数据科学的基本 Python 库
推荐:使用 NSDT场景编辑器 助你快速搭建3D应用场景 这篇文章针对的是刚开始使用Python进行AI的人,以及那些有经验的人,但对下一步要学习什么有疑问的人。我们将不时花点时间向初学者介绍基本术语和概念。如果您已经熟悉它们,我们鼓…...

Kafka 简介 + 学习笔记
消息队列 先说明消息队列是什么: 亚马逊: 消息队列是一种异步的服务间通信方式,适用于微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高…...

Mybatis小记
目录 Mybatis第一个程序 xml文件 测试类 错误排查 Mybatis第一个程序 1.搭建实验数据库 2.导入MyBatis相关jar包 3.编写MyBatis核心配置文件 4.编写MyBatis工具类 5.创建实体类、 6.编写Mapper接口类 7.编写Mapper.xml配置文件 8.编写测试类 对象传参只引用需要的属性就可…...

如何向BertModel增加字符
这里写自定义目录标题 看起来add_special_tokens和add_tokens加入的新token都不会被切分。...

copilot切换下一条提示的快捷键
注意是右ALT 右ALT] 触发提示 右ALT/ 参考 https://www.cnblogs.com/strengthen/p/17210356.html...

Mongodb 删除文档Delete与Remove的区别
db.collection.remove() 此方法已被 mongosh 弃用 已弃用的方法替代方法db.collection.remove()db.collection.deleteOne() db.collection.deleteMany() db.collection.findOneAndDelete() db.collection.bulkWrite() 5.0版本更改。 db.collection.remove(<query>,…...

Docker 的基本概念和优势
Docker 是一种开源的容器化平台,可以轻松部署、管理和运行应用程序。它基于 Linux 容器技术,可以将应用程序和其依赖项打包到一个可移植的容器中,从而使应用程序更易于部署、移植和扩展。 Docker 的主要优势包括: 1. 简化部署&a…...

基于 xhr 实现 axios
基于 xhr 实现 axios 上面我们讲到二次封装 axios ,但是现在我们尝试完全脱离 axios,自己实现一个 axios,由于 axios 底层是基于 xhr 做了二次封装,所以我们也可以尝试一下。 xhr 二次封装 src/plugins/xhr.js /*** 请求拦截器…...

基于面向对象的大模型代码生成
众多周至,大模型非常依赖上下文,要让大模型生成比较好的代码,必须准确地给大模型传递上下文信息和指令。 痛点 目前大模型主要以自然语言进行交互,通过自然语言交互的好处是降低大模型的使用门槛,但是由于语言的不精确…...

易云维®FMCS厂务系统创造工厂全新的“数字低碳智能”应用场景
近年来,新一代信息技术的高速发展为传统工业与制造业领域带来了新的机遇。信息技术加持下的制造技术发展出了新的生产方式、产业形态与管理模式。通过搭建FMCS厂务系统进行数字化转型来实现数据互联互通与业务高效协同,助力企业向安全、绿色、节能、高效…...

【Linux应用部署篇】在CSDN云IDE平台部署Etherpad文档编辑器
【Linux应用部署篇】在CSDN云IDE平台部署Etherpad文档编辑器 一、CSDN云IDE平台介绍1.1 CSDN云IDE平台简介1.2 CSDN云IDE平台特点 二、本次实践介绍2.1 本次实践介绍2.2 Etherpad简介 三、登录CSDN云IDE平台3.1 登录CSDN开发云3.2 登录云IDE3.3 新建工作空间3.4 进入工作空间 四…...

基于java swing和mysql实现的汽车租赁管理系统(源码+数据库+文档+运行指导视频)
一、项目简介 本项目是一套基于java swing和mysql实现的汽车租赁管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、项目文档、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经…...

Rigs-of-rods安装
Rigs-of-rods安装 安装git 首先下载git,下载地址:https://git-scm.com/download/win,安装git 安装cmake 下载cmake,下载地址:https://cmake.org/download/,安装cmake 安装vs2022下载ror的依赖库 git clone https://github.co…...

html学习第2篇---标签(1)
html学习第2篇---标签 1、标题标签h1---h62、段落标签p3、换行标签br4、文本格式化标签5、div标签和span标签6、图像标签img6.1、图像属性6.2、相对路径、绝对路径 7、超链接标签a7.1、属性7.2、分类 8、注释标签和特殊字符8.1、注释8.2、特殊字符 1、标题标签h1—h6 为了使网…...

爬虫逆向实战(二十四)--某鸟记录中心
一、数据接口分析 主页地址:某鸟记录中心 1、抓包 通过抓包可以发现数据接口是front/record/search/page 2、判断是否有加密参数 请求参数是否加密? 通过查看“载荷”模块可以发现,请求参数是加密的 请求头是否加密? 通过查…...

【操作系统】中断和异常
中断的作用 CPU上会执行两种程序:内核程序和应用程序 在适合的情况下,操作系统内核会把CPU的使用权主动让给应用程序,“中断”是让操作系统内核夺回CPU使用权的唯一途径(用户态转内核态)。 中断技术保证了并发。 中…...