Spaces:
Sleeping
Sleeping
# ocxserialtest.py | |
# | |
# Sample that uses the mscomm OCX to talk to a serial | |
# device. | |
# Very simple - queries a modem for ATI responses | |
import pythoncom | |
import win32con | |
import win32ui | |
import win32uiole | |
from pywin.mfc import activex, dialog | |
from win32com.client import gencache | |
SERIAL_SETTINGS = "19200,n,8,1" | |
SERIAL_PORT = 2 | |
win32ui.DoWaitCursor(1) | |
serialModule = gencache.EnsureModule("{648A5603-2C6E-101B-82B6-000000000014}", 0, 1, 1) | |
win32ui.DoWaitCursor(0) | |
if serialModule is None: | |
raise ImportError("MS COMM Control does not appear to be installed on the PC") | |
def MakeDlgTemplate(): | |
style = ( | |
win32con.DS_MODALFRAME | |
| win32con.WS_POPUP | |
| win32con.WS_VISIBLE | |
| win32con.WS_CAPTION | |
| win32con.WS_SYSMENU | |
| win32con.DS_SETFONT | |
) | |
cs = win32con.WS_CHILD | win32con.WS_VISIBLE | |
dlg = [ | |
["Very Basic Terminal", (0, 0, 350, 180), style, None, (8, "MS Sans Serif")], | |
] | |
s = win32con.WS_TABSTOP | cs | |
dlg.append( | |
[ | |
"RICHEDIT", | |
None, | |
132, | |
(5, 5, 340, 170), | |
s | |
| win32con.ES_WANTRETURN | |
| win32con.ES_MULTILINE | |
| win32con.ES_AUTOVSCROLL | |
| win32con.WS_VSCROLL, | |
] | |
) | |
return dlg | |
#################################### | |
# | |
# Serial Control | |
# | |
class MySerialControl(activex.Control, serialModule.MSComm): | |
def __init__(self, parent): | |
activex.Control.__init__(self) | |
serialModule.MSComm.__init__(self) | |
self.parent = parent | |
def OnComm(self): | |
self.parent.OnComm() | |
class TestSerDialog(dialog.Dialog): | |
def __init__(self, *args): | |
dialog.Dialog.__init__(*(self,) + args) | |
self.olectl = None | |
def OnComm(self): | |
event = self.olectl.CommEvent | |
if event == serialModule.OnCommConstants.comEvReceive: | |
self.editwindow.ReplaceSel(self.olectl.Input) | |
def OnKey(self, key): | |
if self.olectl: | |
self.olectl.Output = chr(key) | |
def OnInitDialog(self): | |
rc = dialog.Dialog.OnInitDialog(self) | |
self.editwindow = self.GetDlgItem(132) | |
self.editwindow.HookAllKeyStrokes(self.OnKey) | |
self.olectl = MySerialControl(self) | |
try: | |
self.olectl.CreateControl( | |
"OCX", | |
win32con.WS_TABSTOP | win32con.WS_VISIBLE, | |
(7, 43, 500, 300), | |
self._obj_, | |
131, | |
) | |
except win32ui.error: | |
self.MessageBox("The Serial Control could not be created") | |
self.olectl = None | |
self.EndDialog(win32con.IDCANCEL) | |
if self.olectl: | |
self.olectl.Settings = SERIAL_SETTINGS | |
self.olectl.CommPort = SERIAL_PORT | |
self.olectl.RThreshold = 1 | |
try: | |
self.olectl.PortOpen = 1 | |
except pythoncom.com_error as details: | |
print( | |
"Could not open the specified serial port - %s" | |
% (details.excepinfo[2]) | |
) | |
self.EndDialog(win32con.IDCANCEL) | |
return rc | |
def OnDestroy(self, msg): | |
if self.olectl: | |
try: | |
self.olectl.PortOpen = 0 | |
except pythoncom.com_error as details: | |
print("Error closing port - %s" % (details.excepinfo[2])) | |
return dialog.Dialog.OnDestroy(self, msg) | |
def test(): | |
d = TestSerDialog(MakeDlgTemplate()) | |
d.DoModal() | |
if __name__ == "__main__": | |
from . import demoutils | |
if demoutils.NeedGoodGUI(): | |
test() | |