Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 6, 2008 16:16:52

AleXanrd
От:
Зарегистрирован: 2008-04-05
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с COM портом (pyserial-2.4)

День добрый, подскажите что еще кроме самого pyserial-2.4 необходимо для того чтоб не выдавало ошибку
>>> import serial

Traceback (most recent call last):
File “<pyshell#0>”, line 1, in <module>
import serial
File “C:\Python25\Lib\site-packages\serial\__init__.py”, line 18, in <module>
from serialwin32 import *
File “C:\Python25\Lib\site-packages\serial\serialwin32.py”, line 9, in <module>
import win32file # The base COM port and file IO functions.
ImportError: No module named win32file

установил еще pywin32-212.win32-py2.5.exe, но все равно не помогает, помогите кто знает как правильно настроить. Спасибо!



Офлайн

#2 Сен. 8, 2008 11:11:00

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с COM портом (pyserial-2.4)

Вот нашел в пакете pywin32 файлик win32comport_demo.py. Сам с компортами не работал на прямую.

# This is a simple serial port terminal demo.
#
# Its primary purpose is to demonstrate the native serial port access offered via
# win32file.

# It uses 3 threads:
# - The main thread, which cranks up the other 2 threads, then simply waits for them to exit.
# - The user-input thread - blocks waiting for a keyboard character, and when found sends it
# out the COM port. If the character is Ctrl+C, it stops, signalling the COM port thread to stop.
# - The COM port thread is simply listening for input on the COM port, and prints it to the screen.

# This demo uses userlapped IO, so that none of the read or write operations actually block (however,
# in this sample, the very next thing we do _is_ block - so it shows off the concepts even though it
# doesnt exploit them.

from win32file import * # The base COM port and file IO functions.
from win32event import * # We use events and the WaitFor[Multiple]Objects functions.
import win32con # constants.
import msvcrt # For the getch() function.

import threading
import sys

def FindModem():
# Snoop over the comports, seeing if it is likely we have a modem.
for i in range(1,5):
port = "COM%d" % (i,)
try:
handle = CreateFile(port,
win32con.GENERIC_READ | win32con.GENERIC_WRITE,
0, # exclusive access
None, # no security
win32con.OPEN_EXISTING,
win32con.FILE_ATTRIBUTE_NORMAL,
None)
# It appears that an available COM port will always success here,
# just return 0 for the status flags. We only care that it has _any_ status
# flags (and therefore probably a real modem)
if GetCommModemStatus(handle) != 0:
return port
except error:
pass # No port, or modem status failed.
return None

# A basic synchronous COM port file-like object
class SerialTTY:
def __init__(self, port):
if type(port)==type(0):
port = "COM%d" % (port,)
self.handle = CreateFile(port,
win32con.GENERIC_READ | win32con.GENERIC_WRITE,
0, # exclusive access
None, # no security
win32con.OPEN_EXISTING,
win32con.FILE_ATTRIBUTE_NORMAL | win32con.FILE_FLAG_OVERLAPPED,
None)
# Tell the port we want a notification on each char.
SetCommMask(self.handle, EV_RXCHAR)
# Setup a 4k buffer
SetupComm(self.handle, 4096, 4096)
# Remove anything that was there
PurgeComm(self.handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR )
# Setup for overlapped IO.
timeouts = 0xFFFFFFFF, 0, 1000, 0, 1000
SetCommTimeouts(self.handle, timeouts)
# Setup the connection info.
dcb = GetCommState( self.handle )
dcb.BaudRate = CBR_115200
dcb.ByteSize = 8
dcb.Parity = NOPARITY
dcb.StopBits = ONESTOPBIT
SetCommState(self.handle, dcb)
print "Connected to %s at %s baud" % (port, dcb.BaudRate)

def _UserInputReaderThread(self):
overlapped = OVERLAPPED()
overlapped.hEvent = CreateEvent(None, 1, 0, None)
try:
while 1:
ch = msvcrt.getch()
if ord(ch)==3:
break
WriteFile(self.handle, ch, overlapped)
# Wait for the write to complete.
WaitForSingleObject(overlapped.hEvent, INFINITE)
finally:
SetEvent(self.eventStop)

def _ComPortThread(self):
overlapped = OVERLAPPED()
overlapped.hEvent = CreateEvent(None, 1, 0, None)
while 1:
# XXX - note we could _probably_ just use overlapped IO on the win32file.ReadFile() statement
# XXX but this tests the COM stuff!
rc, mask = WaitCommEvent(self.handle, overlapped)
if rc == 0: # Character already ready!
SetEvent(overlapped.hEvent)
rc = WaitForMultipleObjects([overlapped.hEvent, self.eventStop], 0, INFINITE)
if rc == WAIT_OBJECT_0:
# Some input - read and print it
flags, comstat = ClearCommError( self.handle )
rc, data = ReadFile(self.handle, comstat.cbInQue, overlapped)
WaitForSingleObject(overlapped.hEvent, INFINITE)
sys.stdout.write(data)
else:
# Stop the thread!
# Just incase the user input thread uis still going, close it
sys.stdout.close()
break

def Run(self):
self.eventStop = CreateEvent(None, 0, 0, None)
# Start the reader and writer threads.
user_thread = threading.Thread(target = self._UserInputReaderThread)
user_thread.start()
com_thread = threading.Thread(target = self._ComPortThread)
com_thread.start()
user_thread.join()
com_thread.join()

if __name__=='__main__':
print "Serial port terminal demo - press Ctrl+C to exit"
if len(sys.argv)<=1:
port = FindModem()
if port is None:
print "No COM port specified, and no modem could be found"
print "Please re-run this script with the name of a COM port (eg COM3)"
sys.exit(1)
else:
port = sys.argv[1]

tty = SerialTTY(port)
tty.Run()



Офлайн

#3 Сен. 9, 2008 03:20:03

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с COM портом (pyserial-2.4)

Хм. у меня все работает.
Может pywin криво поставился?
проверь что у тебя существует файл
Путь_к_питону\Lib\site-packages\win32\win32file.pyd



Офлайн

#4 Сен. 9, 2008 11:44:56

AleXanrd
От:
Зарегистрирован: 2008-04-05
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с COM портом (pyserial-2.4)

shiza
Хм. у меня все работает.
Может pywin криво поставился?
проверь что у тебя существует файл


Путь_к_питону\Lib\site-packages\win32\win32file.pyd
У меня такой файл существует, Ferroman, подсказал что надо поставить еще ActivePython-2.5.2.2-win32-x86.msi но и с ним ругаеться выдает

>>> import serial

Traceback (most recent call last):
File “<pyshell#0>”, line 1, in <module>
import serial
File “C:\Python25\Lib\site-packages\serial\__init__.py”, line 18, in <module>
from serialwin32 import *
File “C:\Python25\Lib\site-packages\serial\serialwin32.py”, line 9, in <module>
import win32file # The base COM port and file IO functions.
File “C:\Python25\lib\site-packages\win32file.py”, line 12, in <module>
__load()
File “C:\Python25\lib\site-packages\win32file.py”, line 10, in __load
mod = imp.load_dynamic(__name__, path)
ImportError: DLL load failed: Не найден указанный модуль.
>>>

что за модуль? Как узнать, может пути не все прописаны???



Офлайн

#5 Сен. 9, 2008 15:05:48

AleXanrd
От:
Зарегистрирован: 2008-04-05
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с COM портом (pyserial-2.4)

Все нормально, я до этого немного был натупил, по неосторожности размножил файл win32file.py, отсюда то и возникали ошибки, а в самом первом случае не работало судя по всему из за отсутствия ActivePython-2.5.2.2-win32-x86.msi, который можна скачать по ссылке http://www.activestate.com/Products/activepython/index.mhtml
Всех благодарю за оказанную помощь!!!



Офлайн

#6 Дек. 2, 2009 01:16:39

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Работа с COM портом (pyserial-2.4)

не вижу проблемы , я просто добавил pywin32 в свой питон и у меня без ошибок всё отработало _первая_ссылка_для_2.6_версии_питона_можно_найти_и_для_более_старых_
чётко написано

Requirements
------------
- Python 2.2 or newer
- win32all extensions on Windows
- "Java Communications" (JavaComm) extension for Java/Jython

Отредактировано (Дек. 2, 2009 01:27:39)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version