|
[ vedranp @ 27.04.2005. 01:23 ] @
| Potrebno je na com port slati svakih 2ms tj 60ms (2-60-2-60-2-60-2-60....) po jedam bit(5 V)
u toku odredjenog vremena (5min,10min...).
Ustvri vreme se moze podesavati ali je reda milisekundi, no to su tehnicke stvari.
zanima me samo kako se port otvara i kako se salju podaci(tj. bitovi)
Uredjaj koji prima bitove ne salje nikakve podatke racunaru.
Postoi li neka gotova klasa u javi ili MFC-u tj. c++ za programiranje com porta!
Da li se ovo vreme moze da ispostuje, mislim 2ms je to ok!
Kako bi mogao da merim precizno to vreme,tj da posaljem na svakih 2ms(60ms) tacno jedan bit!
[Ovu poruku je menjao vedranp dana 27.04.2005. u 04:15 GMT+1] |
[ zaraza @ 27.04.2005. 02:28 ] @
ja stvarno ne znam koja je adresa serijskoj porta, ali ja sam se zezao sa paralelinim i to je bilo vrvl ojednostavno,m dakle na odredjunu adersu posaljes odredjeni hex/dec brroj i to je to...program koji je to radio je jako jako jednostavan, glavna funkcija u C koju sam koristio je bila outb() (ili sam ovo odvalio ne mogu da se setim) uglavnom bilo je vrlio jednostavno, mislim slati bitove na taj port.......
[ Mijalko @ 27.04.2005. 07:34 ] @
Pozdrav,
za programiranje COM porta pogledaj:
[url]http://www.elitesecurity.org/tema/104747[/url]
Sto se tice vremena WM_TIME poruku odmah odbaci kao mogucnost za precizno odredjivanje proteklog vremena. Preporucujem koriscenje timeSetEvent f-je ali potrebno je poznavanje multithread programiranja. Ako neces da ucis multithread programiranje i ako ti nije bitno sto ti je procesor uvek na 100% iskoriscenosti mozes da koristis GetTickCount() f-ju.
Mijalko
[ vedranp @ 27.04.2005. 14:52 ] @
Uspeo sam da se snadjem!
Mislim pomocu class CPortController u mfc sve je ok, nego me brine vreme!
Sa WM_TIME porukama sam pokusao ali nema sanse da me ispostuje za interval od 2ms.
Sto se tice multithread programiranja (mada i bacanje WM_TIME poruka se na neki nacin izvodi kao multithread), to mi negine ali tek malo kasnije nego postoji li neka realna sansa da ovo sa vremenom resim na drugi nacin!
[ Mijalko @ 28.04.2005. 07:30 ] @
CPortController? Ne bih rek'o da je to iz mfc-a, al sve jedno. Drago mi je da si se snaso.
WM_TIMER poruka nema veze sa multithread.
Citat:
TheDispatchMessage Windows function sends a WM_TIMER message when no other messages are in the application’s message queue.
Zbog toga covek ne moze da se osloni na ovu poruku.
Probaj ovo instant resenje:
Code:
DWORD dwStart = GetTickCount();
DWORD dwEnd = dwStart;
while ( (dwEnd >= dwStart) && (dwStart + 60) < dwEnd)
{
dwEnd = GetTickCount();
}
UradiStaTreba();
Ovo ne bi trebalo tako da se radi jer se bespotrebno zauzima procesor, ali trazili ste-gledajte.
Pozdrav,
Mijalko
[ vedranp @ 28.04.2005. 15:41 ] @
Zasto mislis da nije iz mfc-a ako sam rekao da sam tamo nasao?
U Visual studiu 6.0
Project/add to project/components and control/Active x Control/
i nadjes PortController class.
Hvala za GetTickCount()!
pozdrav
a evo i deklaracije klase
#if !defined(AFX_PORTCONTROLLER_H__AD8A6E73_F747_4276_A464_9D3EF9EB76DE__INCLUDED_)
#define AFX_PORTCONTROLLER_H__AD8A6E73_F747_4276_A464_9D3EF9EB76DE__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CPortController : public CWnd
{
protected:
DECLARE_DYNCREATE(CPortController)
public:
CLSID const& GetClsid()
{
static CLSID const clsid
= { 0x3f40e581, 0xc9da, 0x42a6, { 0x89, 0x54, 0x4b, 0x70, 0xcc, 0x91, 0x6a, 0x8d } };
return clsid;
}
virtual BOOL Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd, UINT nID,
CCreateContext* pContext = NULL)
{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); }
BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID,
CFile* pPersist = NULL, BOOL bStorage = FALSE,
BSTR bstrLicKey = NULL)
{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
pPersist, bStorage, bstrLicKey); }
// Attributes
public:
// Operations
public:
long GetBaudRate();
void SetBaudRate(long nNewValue);
short GetDataBits();
void SetDataBits(short nNewValue);
short GetParity();
void SetParity(short nNewValue);
short GetStopBits();
void SetStopBits(short nNewValue);
CString GetPortName();
long GetCd();
long GetCts();
long GetDsr();
long GetDtr();
void SetDtr(long nNewValue);
long GetDtrDsr();
void SetDtrDsr(long nNewValue);
long GetRtsCts();
void SetRtsCts(long nNewValue);
long GetRts();
void SetRts(long nNewValue);
long GetXonXoff();
void SetXonXoff(long nNewValue);
long GetPortHandle();
long GetBreak();
void SetBreak(long nNewValue);
long GetBytesUsedRQ();
long GetBytesUsedTQ();
long GetRing();
CString GetEventChar();
void SetEventChar(LPCTSTR lpszNewValue);
long GetFireOnEventChar();
void SetFireOnEventChar(long nNewValue);
long GetEnableReadOnEventChar();
void SetEnableReadOnEventChar(long nNewValue);
void Open(LPCTSTR PortName, LPCTSTR Settings);
void Close();
long Write(LPCTSTR WriteBuffer, long NumBytesToWrite, long Timeout);
CString Read(long NumBytesToRead, long Timeout, long* pNumBytesRead);
void ClearRQ();
void ClearTQ();
void GetErrorStatus(long* ParityError, long* FramingError, long* OverrunError);
void SendXon();
void SendXoff();
long WriteBinary(long pWriteBuffer, long NumBytesToWrite, long Timeout);
long ReadBinary(long NumBytesToRead, long Timeout, long* pNumBytesRead);
long GetIsOpen();
};
#endif // !defined(AFX_PORTCONTROLLER_H__AD8A6E73_F747_4276_A464_9D3EF9EB76DE__INCLUDED_)
[ Mijalko @ 29.04.2005. 07:22 ] @
Citat: vedranp: Zasto mislis da nije iz mfc-a ako sam rekao da sam tamo nasao?
U Visual studiu 6.0
Project/add to project/components and control/Active x Control/
i nadjes PortController class.
Hmm.... Ja tu ActiveX kontrolu nemam kod sebe. Da tu kontrolu nisi dobio sa instalacijom nekog programa?
Mijalko
[ vedranp @ 29.04.2005. 10:49 ] @
http://www.scientificcomponent.com/portcontroller.htm
Probao sam i sa GetTickCount()
Definitivno ne moze! Nasao sam da je najmanja
vrednost za sleep 10ms za pc. Stvar do schedulera i clktck.
Preko 10ms radi ok al ispod preskace.
Da li bi mogao da izgenerisem bafer od 20 bitova logicke "1" pa to posaljem pri brzini 9600bit/sek tj 1/9600*20=2.08ms pa da tako dobijem impuls od 2ms!
Ustvari ako je brzina 9600 da li znaci da se bit zadrzava 1/9600sek na izlazu?
[ rikelme @ 08.05.2005. 08:56 ] @
Jesi li probao sa funkcijom:
Sleep
The Sleep function suspends the execution of the current thread for a specified interval.
VOID Sleep(
DWORD dwMilliseconds // sleep time in milliseconds
);
Parameters
dwMilliseconds
Specifies the time, in milliseconds, for which to suspend execution. A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If there are no other threads of equal priority ready to run, the function returns immediately, and the thread continues execution. A value of INFINITE causes an infinite delay.
QuickInfo
Windows NT: Requires version 3.1 or later.
Windows: Requires Windows 95 or later.
Windows CE: Requires version 1.0 or later.
Header: Declared in winbase.h.
Import Library: Use kernel32.lib.
Meni je radila i za single i multithreaded aplikacije.
Pozdrav.
[ Mijalko @ 11.05.2005. 07:21 ] @
Pogledaj ovo:
[url]http://www.codeproject.com/cpp/duration.asp[/url]
Pozdrav,
Mijalko
[ vedranp @ 27.05.2005. 18:14 ] @
Moze li brzina serijskog (rs232) porta
da se postavi na neku vrednost koja nije ponudjena kao standarad(tj.300,600...
2400..9600...12800)
Recimo na vrednost 1000 bit/sek!
[ dragansm @ 28.05.2005. 07:29 ] @
Za precizno merenje vremena su korisne funkcije QueryPerformanceCounter i QueryPerformanceFrequency. Mislim da sam negde procitao da je najmanje vreme koje se moze meriti bez ovog multimedijalnog tajmera 50-60 ms.
Primer koriscenja (izvor MSDN):
Code:
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
// class used to perform timings
class Timer
{
public:
Timer()
{
QueryPerformanceFrequency((LARGE_INTEGER*)&m_freq);
}
// starts the timer
void Start()
{
QueryPerformanceCounter((LARGE_INTEGER*)&m_start);
}
// returns the number of milliseconds
DWORD End()
{
__int64 li, diff;
QueryPerformanceCounter((LARGE_INTEGER*)&li);
diff = li - m_start;
diff = (diff * 1000)/m_freq;
return (DWORD)(diff & 0xffffffff);
}
__int64 m_freq;
__int64 m_start;
};
[ X Files @ 28.05.2005. 08:03 ] @
Citat:
Mislim da sam negde procitao da je najmanje vreme koje se moze meriti bez
ovog multimedijalnog tajmera 50-60 ms.
Tačno.
Standardna Tajmer komponenta koristi SetTimer Win32 API funkciju koja
šalje WM_TIMER poruku u red za poruke. Maksimalna frekvencija koja se ovim
postiže je oko 18 puta u sekundi (1000ms/18=55). Dakle, tačno 50-60 ;)
Multimedijalni tajmeri koriste "callback funkcije" i tako omogućavaju tajmere sa
visokom frekvencijom.
U praksi "obične" Tajmer komponennte (kod Borlanda TTimer) su u "realnim"
uslovima, kada je program opterećen nekim operacijama - beskorisne. Da ne
pominjem da je multimedijalni tajmer 64bitni dok je "običan tajmer" 32bitni pa
posle 49,7 dana dolazi do prebačaja. Doduše, i to se može "peglati" posebnim
delom koda ali...
[ blaza @ 28.05.2005. 10:59 ] @
Citat: Mislim da sam negde procitao da je najmanje vreme koje se moze meriti bez ovog multimedijalnog tajmera 50-60 ms
Da li si siguran da se radi o multimedijalnom tajmeru? Ako se dobro secam, radi se o wrapper-u za IA32 RDTSC instrukciju.
[ dragansm @ 28.05.2005. 11:13 ] @
Citat:
Da li si siguran da se radi o multimedijalnom tajmeru? Ako se dobro secam, radi se o wrapper-u za IA32 RDTSC instrukciju.
Citiracu napomenu uz f-ju timeGetTime() iz MSDN-a:
Citat:
Windows NT/2000: The default precision of the timeGetTime function can be five milliseconds or more, depending on the machine. You can use the timeBeginPeriod and timeEndPeriod functions to increase the precision of timeGetTime. If you do so, the minimum difference between successive values returned by timeGetTime can be as large as the minimum period value set using timeBeginPeriod and timeEndPeriod. Use the QueryPerformanceCounter and QueryPerformanceFrequency functions to measure short time intervals at a high resolution
[ blaza @ 28.05.2005. 11:39 ] @
timeGetTime() je deo Multimedia API, a QueryPerformanceCounter() nije, pa stoga nije ni multimedijalni tajmer.
Citat: BOOL QueryPerformanceCounter(
LARGE_INTEGER *lpPerformanceCount
);
Header Declared in Winbase.h, include Windows.h
Import library Kernel32.lib
[ dragansm @ 28.05.2005. 11:51 ] @
Upravu si... radi se o "high-resolution performance counter-u", a ovaj drugi je multimedijalni (zahteva header "Mmsystem.h"). Covek svakog dana nauci nesto novo... ili razbije terminoloske dileme. Pozdrav
[ blaza @ 28.05.2005. 12:06 ] @
Nas Dragi Tata je napisao odlican tutorijal o tajmerima.
[ Nedeljko @ 10.07.2008. 08:58 ] @
Citat: dragansm: Mislim da sam negde procitao da je najmanje vreme koje se moze meriti bez ovog multimedijalnog tajmera 50-60 ms.
Ne daj Boze da je tacno ovako kako si napisao. 50-60ms se cita kao 50-60 milisekundi. To je rezolucija koja je postojala pod MS DOS-om. No, ti si verovatno hteo da kazes 50-60 mikrosekundi. E, to se vec pise ovako:  .
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|