baseSerail.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. # -*- coding: UTF-8 -*-
  2. import serial
  3. import time
  4. import binascii
  5. '''
  6. 描述:串口同步基类
  7. '''
  8. class BaseSerial():
  9. # 构造函数
  10. def __init__(self):
  11. self.exception = None
  12. self.ser = serial.Serial()
  13. '''
  14. 打开串口
  15. '''
  16. def open(self, port, baudrate=115200, bytesize=8, parity=serial.PARITY_NONE, stopbits=1, timeout=3, writeTimeout=0.5):
  17. if type(port) == type(0):
  18. self.ser.port = "COM" + str(port)
  19. else:
  20. self.ser.port = port
  21. # 波特率;
  22. self.ser.baudrate = baudrate
  23. # 数据位;
  24. self.ser.bytesize = bytesize
  25. # 校验码;
  26. self.ser.parity = parity # PARITY_NONE=0
  27. # 停止位;
  28. self.ser.stopbits = stopbits
  29. # 串口读超时值
  30. self.ser.timeout = timeout
  31. # 串口写超时值
  32. self.ser.write_timeout = writeTimeout
  33. try:
  34. self.ser.open()
  35. # 返回结果;
  36. return self.ser.is_open
  37. except Exception as e:
  38. self.exception = e
  39. print('打开串口异常', str(e))
  40. return False
  41. '''
  42. 重新打开串口
  43. '''
  44. def reOpen(self):
  45. self.exception = None
  46. self.ser.close()
  47. try:
  48. self.ser.open()
  49. # 返回结果;
  50. return self.ser.is_open
  51. except Exception as e:
  52. self.exception = e
  53. return False
  54. '''关闭串口'''
  55. def close(self):
  56. self.ser.close()
  57. '''
  58. 描述:写串口
  59. '''
  60. def write(self, cmd: bytearray):
  61. try:
  62. self.exception = None
  63. writelen = self.ser.write(cmd)
  64. # flush等待写入完成;
  65. self.ser.flush()
  66. print("writehex:" + str(binascii.b2a_hex(cmd)) + " writelen=" + str(writelen))
  67. return True if writelen == len(cmd) else False
  68. except Exception as e:
  69. self.exception = e
  70. print('写串口异常', str(e))
  71. return False
  72. '''
  73. 描述:读取串口数据;
  74. 返回:返回16进制字符串;
  75. 补充:ser.in_waiting 实际是缓冲区里的数据长度,也就是要读的长度;
  76. '''
  77. def read(self, size=0):
  78. try:
  79. time.sleep(0.1) # 必备的等待-机器响应;
  80. self.exception = None
  81. # 先读取1个,如果超时表示通讯失败;
  82. bys = self.ser.read(1)
  83. for i in range(0, 3):
  84. while self.ser.in_waiting > 0:
  85. d = self.ser.read(1)
  86. bys = bys + d
  87. # 每当缓冲区为0,等10ms,循环3次确保机器响应完全;
  88. time.sleep(0.01)
  89. # 再判断是否读取到指定大小(size!=0);
  90. if bys.__len__() < size:
  91. time.sleep(0.1) # 等待0.1秒让机器响应;
  92. if self.ser.in_waiting > 0:
  93. d = self.ser.read(self.ser.in_waiting)
  94. bys = bys + d
  95. print("readhex:" + str(binascii.hexlify(bys)) + " readlen=" + str(bys.__len__()))
  96. return bys
  97. except Exception as e:
  98. self.exception = e
  99. print('读串口异常', str(e))
  100. return None
  101. def read2(self, size=0):
  102. try:
  103. self.exception = None
  104. time.sleep(0.01)
  105. # 先读取1个,如果超时表示通讯失败;
  106. bys = self.ser.read(1)
  107. while self.ser.in_waiting > 0:
  108. d = self.ser.read(1)
  109. bys = bys + d
  110. # 再sleep一会,机器响应可能过慢,导致有字节遗漏;
  111. time.sleep(0.015)
  112. while self.ser.in_waiting > 0:
  113. d = self.ser.read(1)
  114. bys = bys + d
  115. # 再判断是否读取到指定大小(size!=0);
  116. if bys.__len__() < size:
  117. time.sleep(0.1) # 等待0.1秒让机器响应;
  118. if self.ser.in_waiting > 0:
  119. d = self.ser.read(self.ser.in_waiting)
  120. bys = bys + d
  121. print("readhex:" + str(binascii.hexlify(bys)) + " readlen=" + str(bys.__len__()))
  122. return bys
  123. except Exception as e:
  124. self.exception = e
  125. print('读串口异常', str(e))
  126. return None
  127. if __name__ == "__main__":
  128. pass