serialutil.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #coding=gb18030
  2. import threading
  3. import time
  4. import serial
  5. class ComThread:
  6. def __init__(self, Port='COM4'):
  7. self.l_serial = None
  8. self.alive = False
  9. self.waitEnd = None
  10. self.port = Port
  11. self.ID = None
  12. self.data = None
  13. def waiting(self):
  14. if not self.waitEnd is None:
  15. self.waitEnd.wait()
  16. def SetStopEvent(self):
  17. if not self.waitEnd is None:
  18. self.waitEnd.set()
  19. self.alive = False
  20. self.stop()
  21. def start(self):
  22. self.l_serial = serial.Serial()
  23. self.l_serial.port = self.port
  24. self.l_serial.baudrate = 115200
  25. self.l_serial.timeout = 2
  26. self.l_serial.open()
  27. if self.l_serial.isOpen():
  28. self.waitEnd = threading.Event()
  29. self.alive = True
  30. self.thread_read = None
  31. self.thread_read = threading.Thread(target=self.FirstReader)
  32. self.thread_read.setDaemon(1)
  33. self.thread_read.start()
  34. return True
  35. else:
  36. return False
  37. def SendDate(self,i_msg,send):
  38. lmsg = ''
  39. isOK = False
  40. if isinstance(i_msg):
  41. lmsg = i_msg.encode('gb18030')
  42. else:
  43. lmsg = i_msg
  44. try:
  45. # 发送数据到相应的处理组件
  46. self.l_serial.write(send)
  47. except Exception as ex:
  48. pass;
  49. return isOK
  50. def FirstReader(self):
  51. while self.alive:
  52. time.sleep(0.1)
  53. data = ''
  54. data = data.encode('utf-8')
  55. n = self.l_serial.inWaiting()
  56. if n:
  57. data = data + self.l_serial.read(n)
  58. print('get data from serial port:', data)
  59. print(type(data))
  60. n = self.l_serial.inWaiting()
  61. if len(data)>0 and n==0:
  62. try:
  63. temp = data.decode('gb18030')
  64. print(type(temp))
  65. print(temp)
  66. car,temp = str(temp).split("\n",1)
  67. print(car,temp)
  68. string = str(temp).strip().split(":")[1]
  69. str_ID,str_data = str(string).split("*",1)
  70. print(str_ID)
  71. print(str_data)
  72. print(type(str_ID),type(str_data))
  73. if str_data[-1]== '*':
  74. break
  75. else:
  76. print(str_data[-1])
  77. print('str_data[-1]!=*')
  78. except:
  79. print("读卡错误,请重试!\n")
  80. self.ID = str_ID
  81. self.data = str_data[0:-1]
  82. self.waitEnd.set()
  83. self.alive = False
  84. def stop(self):
  85. self.alive = False
  86. self.thread_read.join()
  87. if self.l_serial.isOpen():
  88. self.l_serial.close()
  89. #调用串口,测试串口
  90. def main():
  91. rt = ComThread()
  92. rt.sendport = '**1*80*'
  93. try:
  94. if rt.start():
  95. print(rt.l_serial.name)
  96. rt.waiting()
  97. print("The data is:%s,The Id is:%s"%(rt.data,rt.ID))
  98. rt.stop()
  99. else:
  100. pass
  101. except Exception as se:
  102. print(str(se))
  103. if rt.alive:
  104. rt.stop()
  105. print('')
  106. print ('End OK .')
  107. temp_ID=rt.ID
  108. temp_data=rt.data
  109. del rt
  110. return temp_ID,temp_data
  111. if __name__ == '__main__':
  112. #设置一个主函数,用来运行窗口,便于若其他地方下需要调用串口是可以直接调用main函数
  113. ID,data = main()
  114. print("******")
  115. print(ID,data)