• 9、监测数据采集物联网应用开发步骤(7)


    源码将于最后一遍文章给出下载

    监测数据采集物联网应用开发步骤(6)

    串口(COM)通讯开发

    本章节测试使用了 Configure Virtual Serial Port Driver虚拟串口工具和本人自写的串口调试工具,请自行baidu下载对应工具

    com.zxy.common.Com_Para.py中添加如下内容

    1. #RS232串口通讯列表 串口号,波特率,数据位,索引(A,B,C,D区分),多串口分割符;
    2. ComPortList = "" #linux参考:/dev/ttyS0,9600,8,0,A;/dev/ttyS1.9600,8,0,B windwows参考:COM1,9600,8,0;COM2,9600,8,2
    3. #串口通讯全局变量hashtable 串口索引---串口对象
    4. htComPort = {}

     在com.zxy.main.Init_Page.py中添加如下内容

    1. @staticmethod
    2. def Start_ComPort():
    3. iIndex = 0
    4. for temComPort in Com_Para.ComPortList.split(";"):
    5. iIndex = iIndex + 1
    6. temComPortInfo = temComPort.split(",")
    7. try:
    8. if len(temComPortInfo) == 5 and Com_Fun.GetHashTableNone(Com_Para.htComPort, temComPortInfo[4]) is None:
    9. temCD = ComDev(temComPortInfo[0], int(temComPortInfo[1]), int(temComPortInfo[2]), int(temComPortInfo[3]), iIndex)
    10. temCD.attPortName = temComPortInfo[4]
    11. Com_Fun.SetHashTable(Com_Para.htComPort, temComPortInfo[4], temCD)
    12. except Exception as e:
    13. print("com link error:COM"+temComPortInfo[0]+"==>" + repr(e)+"=>"+str(e.__traceback__.tb_lineno))
    14. finally:
    15. Pass

    创建串口设备管理类com.zxy.comport.ComDev.py

    1. #! python3
    2. # -*- coding: utf-8 -
    3. '''
    4. Created on 2017年05月10日
    5. @author: zxyong 13738196011
    6. '''
    7. import datetime,threading,time,serial
    8. from com.zxy.common.Com_Fun import Com_Fun
    9. from com.zxy.adminlog.UsAdmin_Log import UsAdmin_Log
    10. from com.zxy.common import Com_Para
    11. from com.zxy.z_debug import z_debug
    12. #监测数据采集物联网应用--串口设备管理
    13. class ComDev(z_debug):
    14. attIndex = 0
    15. attPort = 0
    16. attBaudrate = 9600
    17. attBytesize = 8
    18. attSerial = None
    19. #超时时间(秒) 为了验证测试效果,将时间设置为10秒
    20. attTimeout = 10
    21. #返回值
    22. attReturnValue = None
    23. attPortName = ""
    24. #特殊插件处理
    25. attProtocol = ""
    26. #回发数据
    27. attSendValue = None
    28. #线程锁
    29. attLock = threading.Lock()
    30. def __init__(self, inputPort,inputBaudrate,inputBytesize,inputparity,inputIndex):
    31. self.attPort = inputPort
    32. self.attBaudrate = inputBaudrate
    33. self.attBytesize = inputBytesize
    34. temParity = "N"
    35. if str(inputparity) == "0": #无校验
    36. temParity = "N"
    37. elif str(inputparity) == "1": #偶校验
    38. temParity = "E"
    39. elif str(inputparity) == "2": #奇校验
    40. temParity = "O"
    41. elif str(inputparity) == "3":
    42. temParity = "M"
    43. elif str(inputparity) == "4":
    44. temParity = "S"
    45. self.attSerial = serial.Serial(port=self.attPort,baudrate=self.attBaudrate,bytesize=self.attBytesize,parity=temParity, stopbits=1)
    46. self.attSerial.timeout = self.attTimeout
    47. self.attIndex = inputIndex
    48. self.OpenSeriaPort()
    49. #打开串口
    50. def OpenSeriaPort(self):
    51. try:
    52. if not self.attSerial.isOpen():
    53. self.attSerial.open()
    54. t = threading.Thread(target=self.OnDataReceived, name="ComPortTh" + str(self.attIndex))
    55. t.start()
    56. uL = UsAdmin_Log(Com_Para.ApplicationPath,str("ComPortTh" + str(self.attIndex)))
    57. uL.SaveFileDaySub("thread")
    58. print("Open ComPortTh" + str(self.attIndex)+" COM:"+str(self.attSerial.port)+" "+Com_Fun.GetTimeDef()+" lenThreads:"+str(len(threading.enumerate())))
    59. return True
    60. except Exception as e:
    61. if str(type(self)) == "":
    62. self.debug_in(self,repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息
    63. else:
    64. self.debug_in(repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息
    65. return False
    66. finally:
    67. pass
    68. #关闭串口
    69. def CloseSeriaPort(self):
    70. try:
    71. if not self.attSerial.isOpen():
    72. self.attSerial.close()
    73. return True
    74. except Exception as e:
    75. if str(type(self)) == "":
    76. self.debug_in(self,repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息
    77. else:
    78. self.debug_in(repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息
    79. return False
    80. finally:
    81. pass
    82. #发送数据无返回
    83. def WritePortDataImmed(self,inputByte):
    84. try:
    85. if not self.attSerial.isOpen():
    86. self.OpenSeriaPort()
    87. if self.attSerial.isOpen() and self.attLock.acquire():
    88. self.attReturnValue = None
    89. temNumber = self.attSerial.write(inputByte)
    90. time.sleep(0.2)
    91. self.attLock.release()
    92. return temNumber
    93. else:
    94. return 0
    95. except Exception as e:
    96. if str(type(self)) == "":
    97. self.debug_in(self,repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息
    98. else:
    99. self.debug_in(repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息
    100. return -1
    101. #返回值为字节,带结束符
    102. def WritePortDataFlag(self,inputByte,EndFlag):
    103. try:
    104. if not self.attSerial.isOpen():
    105. self.OpenSeriaPort()
    106. if self.attSerial.isOpen() and self.attLock.acquire():
    107. self.attReturnValue = None
    108. temNumber = self.attSerial.write(inputByte)
    109. starttime = datetime.datetime.now()
    110. endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.attTimeout)
    111. 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:
    112. starttime = datetime.datetime.now()
    113. time.sleep(0.2)
    114. self.attLock.release()
    115. return temNumber
    116. except Exception as e:
    117. if str(type(self)) == "":
    118. self.debug_in(self,repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息
    119. else:
    120. self.debug_in(repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息
    121. return -1
    122. finally:
    123. pass
    124. #返回值为字节
    125. def WritePortData(self,inputByte):
    126. try:
    127. if not self.attSerial.isOpen():
    128. self.OpenSeriaPort()
    129. if self.attSerial.isOpen() and self.attLock.acquire():
    130. self.attReturnValue = None
    131. temNumber = self.attSerial.write(inputByte)
    132. starttime = datetime.datetime.now()
    133. endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.attTimeout)
    134. while self.attReturnValue is None and starttime <= endtime:
    135. starttime = datetime.datetime.now()
    136. time.sleep(0.2)
    137. self.attLock.release()
    138. return temNumber
    139. except Exception as e:
    140. if str(type(self)) == "":
    141. self.debug_in(self,repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息
    142. else:
    143. self.debug_in(repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息
    144. return -1
    145. finally:
    146. pass
    147. #接收数据
    148. def OnDataReceived(self):
    149. try:
    150. while self.attSerial.isOpen():
    151. temNum = self.attSerial.inWaiting()
    152. if temNum > 0:
    153. if self.attReturnValue is None:
    154. self.attReturnValue = self.attSerial.read(temNum)
    155. else:
    156. self.attReturnValue = self.attReturnValue + self.attSerial.read(temNum)
    157. else:
    158. time.sleep(1)
    159. except Exception as e:
    160. if str(type(self)) == "":
    161. self.debug_in(self, repr(e)+"=>"+str(e.__traceback__.tb_lineno))
    162. else:
    163. self.debug_in(repr(e)+"=>"+str(e.__traceback__.tb_lineno))
    164. self.attReturnValue = None

    串口通讯测试案例MonitorDataCmd.py主文件中编写:

    在该语句下添加

    1. #串口配置参数
    2. Com_Para.ComPortList = "COM2,9600,8,0,A;COM4,9600,8,2,B"
    3. #串口连接初始化
    4. Init_Page.Start_ComPort()
    5. #测试串口数据发送和接收
    6. temCP2 = Com_Fun.GetHashTable(Com_Para.htComPort,"A")#获取串口2对象
    7. temCP4 = Com_Fun.GetHashTable(Com_Para.htComPort,"B")#获取串口4对象
    8. temByte1 = ("AABBCCDDVV").encode(Com_Para.U_CODE) #发送字符串转byte[]
    9. temByte2 = ("11223344KM").encode(Com_Para.U_CODE) #发送字符串转byte[]
    10. print("开始发送串口数据")
    11. temRec1 = temCP2.WritePortData(temByte1)#往串口2发送数据
    12. print("串口2发送数据长度:"+str(temRec1))
    13. strRec = ""
    14. if temCP2.attReturnValue != None:
    15. strRec = temCP2.attReturnValue.decode(Com_Para.U_CODE)#收到串口数据
    16. print("串口2收到数据值:"+strRec)
    17. temRec2 = temCP4.WritePortData(temByte2)#往串口4发送数据
    18. print("串口3发送数据长度:"+str(temRec2))
    19. strRec = ""
    20. if temCP4.attReturnValue != None:
    21. strRec = temCP4.attReturnValue.decode(Com_Para.U_CODE)#收到串口数据
    22. print("串口4收到数据值:"+strRec)

    串口调试测试结果:

    1. 监测数据采集物联网应用开发步骤(8.1)
  • 相关阅读:
    理解『注意力机制』的本质
    Rust Trait简介
    linux/kali2023.1工具集合()
    13 mysql date/time/datetime/year 的数据存储
    详解Al作画算法原理
    八、线程池
    【UDS】ISO14229之0x3E服务
    搭建PyTorch神经网络进行气温预测
    elasticsearch-7.8.0 集群搭建
    v-model实现父子互传数据
  • 原文地址:https://blog.csdn.net/yong427/article/details/132560022