Fedora se stala oficiální distribucí WSL (Windows Subsystem for Linux).
Společnost IBM představila server IBM LinuxONE Emperor 5 poháněný procesorem IBM Telum II.
Byla vydána verze 4.0 multiplatformního integrovaného vývojového prostředí (IDE) pro rychlý vývoj aplikaci (RAD) ve Free Pascalu Lazarus (Wikipedie). Přehled novinek v poznámkách k vydání. Využíván je Free Pascal Compiler (FPC) 3.2.2.
Podpora Windows 10 končí 14. října 2025. Připravovaná kampaň Konec desítek (End of 10) může uživatelům pomoci s přechodem na Linux.
Již tuto středu proběhne 50. Virtuální Bastlírna, tedy dle římského číslování L. Bude L značit velikost, tedy více diskutujících než obvykle, či délku, neboť díky svátku lze diskutovat dlouho do noci? Bude i příští Virtuální Bastlírna virtuální nebo reálná? Nejen to se dozvíte, když dorazíte na diskuzní večer o elektronice, softwaru, ale technice obecně, který si můžete představit jako virtuální posezení u piva spojené s učenou
… více »Český statistický úřad rozšiřuje Statistický geoportál o Datový portál GIS s otevřenými geografickými daty. Ten umožňuje stahování datových sad podle potřeb uživatelů i jejich prohlížení v mapě a přináší nové možnosti v oblasti analýzy a využití statistických dat.
Kevin Lin zkouší využívat chytré brýle Mentra při hraní na piano. Vytváří aplikaci AugmentedChords, pomocí které si do brýlí posílá notový zápis (YouTube). Uvnitř brýlí běží AugmentOS (GitHub), tj. open source operační systém pro chytré brýle.
Jarní konference EurOpen.cz 2025 proběhne 26. až 28. května v Brandýse nad Labem. Věnována je programovacím jazykům, vývoji softwaru a programovacím technikám.
Na čem aktuálně pracují vývojáři GNOME a KDE Plasma? Pravidelný přehled novinek v Týden v GNOME a Týden v KDE Plasma.
Já sem si z dovolením také vzal. Jen ten odkaz ukazuje na tuto diskuzi, ne na to PDFko.
Z.H.
#include < stdio.h>
#include < fcntl.h>
#include < termios.h>
#include < sys/ioctl.h>
#include < time.h>
#define SERIAK "/dev/ttyS1"
#define KALIBRACE 1.0
#define DOBA 1000.0
//#define DEBUG
#define JEDNOTKA
int ctsvalue (void);
int frekvence (double brana);
int
ctsvalue (void)
{
int fd, status;
fd = open (SERIAK, O_RDWR | O_NOCTTY);
ioctl (fd, TIOCMGET, &status);
#ifdef DEBUG
if (fd == -1)
{
printf (" nelze inicializovat port");
goto end;
}
else
printf (" status: %d ", ioctl (fd, TIOCMGET, &status));
#endif
if ((status & TIOCM_CTS) != 0)
return 1;
else
return 0;
end:
close (fd);
}
int
frekvence (double brana)
{
unsigned long int citac = 0, stary = 0, vstup = 0;
double elapsed, frekv = 0.0, cas = 0.0;
do
{
clock_t clock ();
vstup = ctsvalue ();
if (vstup)
citac++;
cas = clock ();
}
while (cas < (1000.0 * brana));
#ifdef DEBUG
printf ("cas: %lf citac: %d ", cas, citac);
#endif
frekv = (double) citac / brana;
#ifdef DEBUG
printf ("%d", frekv);
#endif
return (frekv);
}
int
main (void)
{
float napeti = 0.0;
napeti = ((float) frekvence (DOBA)) / 10.0 * KALIBRACE;
printf ("%d", (int) napeti);
#ifdef JEDNOTKA
printf (" mV\n");
#endif
return 0;
}
Jedna se mi zejmena o fci /ctsvalue()/ jestli ji mam spravne. Kdyby mel nekdo generator 1-10kHz, muze to zkusit povesit na seriak "CTS", vystup by mel byt pri 10kHz "1". Radsi bych to resil pres ICQ 319273996, fakt uz mam dost :o).
#include < stdio.h>
#include < fcntl.h>
#include < termios.h>
#include < sys/ioctl.h>
#include < time.h>
int
main ()
{
//for(;;) {
int status=0,fd=0;
fd = open ("/dev/ttyS1", O_RDWR | O_NOCTTY);
ioctl (fd, TIOCMGET, &status);
printf ("Status: ");
if (status & TIOCM_LE)
printf ("DSR ");
if (status & TIOCM_DTR)
printf ("DTR ");
if (status & TIOCM_RTS)
printf ("RTS ");
if (status & TIOCM_CTS)
printf ("CTS ");
if (status & TIOCM_CAR)
printf ("DCD ");
printf ("\n");
//}
return 0;
}
Kdyz nepouziji cyklus for, vse se vypise uplne spravne (v zavislosti na propojeni - hodnoty seriaku) a program se ukonci. Jenze pokud necham program cyklit a stridave spojuji a rozpojuji kontakty CTS a DTR, hodnoty se nemeni a program vraci stale to same, jako pri spusteni, proste nereaguje na spojeni a rozpojeni, coz je asi kamen urazu toho predchoziho programku = asi nebude fungovat :(. Jenze me uz nenapada nic, co bych poupravil, aby to fungovalo.
/* 2005. written for reading voltage from optical link iface */
/* Ronja by U/"f convertor AD654. Program doesn't coming under any */
/* lincense or warranty. If you have any questions, let write them */
/* to me sith@wifistar.net. Mny thks to J. Pribramsky for his help */
#include < stdio.h>
#include < fcntl.h>
#include < termios.h>
#include < sys/ioctl.h>
#include < time.h>
#define SERIAK "/dev/ttyS1"
#define KALIBRACE 1.0
#define DOBA 10.0
//#define DEBUG
//#define JEDNOTKA
int ctsvalue (int fd);
long frekvence ();
int
ctsvalue (int fd)
{
int status;
ioctl (fd, TIOCMGET, &status);
#ifdef DEBUG
if (fd == -1)
{
printf (" nelze inicializovat port");
goto end;
}
#endif
if ((status & TIOCM_CTS) != 0)
return 1;
else
return 0;
end:
}
long
frekvence ()
{
double cas = 0.0;
long tiku = 0;
clock_t start, end;
int fd = open (SERIAK, O_RDWR | O_NOCTTY);
start = clock (); // stav hodin pred spustenim citace
do
{
if (ctsvalue (fd)) // pokud CTS Hi
{
tiku++;
while (ctsvalue (fd)) ; // cekam na CTS Low.
}
end = clock ();
cas = ((double) (end - start)); // celkovy cas mereni
}
while (cas < CLOCKS_PER_SEC); //... pocet tiku/sec
close (fd); //zavri seriak
return tiku; // frekvence v Hz
}
int
main (void)
{
double napeti = 0.0;
napeti = (frekvence ()) / DOBA * KALIBRACE;
printf ("%lf", napeti);
#ifdef JEDNOTKA
printf ("mV\n");
#endif
return 0;
}
if ((status & TIOCM_CTS) != 0) return 1; else return 0;nahradil jediným řádkem
DOBA byla jeste v puvodnim zdroji, nejak to tam zustalo a melo to fungovat jako nastaveni rozliseni (ruzne dlouhe intervaly mereni, pro vetsi presnost) - asi to predelam, napr. zmeny na CTS detekovat xkrat, z toho vysledek.
KALIBRACE slouzila opravdu jako kalibrace mereni - prevodnik bude pracovat ve venkovnich podminkach a rozdil teplot pak pusobi na keramiky (asi i na samotny prevodnik), jestli se nepletu. Ta se ale nahradi foliovym kondenzatorem.
Chyba v ctsvalue() je mi znama byl to zbytek. AD654 kmita az na 500kHz, coz na seriaku nezmerim - piny 6,7 se da pomoci C ovlivnovat kmitocet: 10n / 10kHz / 1V.
Dekuji za TIOCMIWAIT, nikde jsem na to nenarazil, opravdu se to velmi libi .
/* 2005. written for reading voltage from optical link iface */
/* Ronja by U/"f convertor AD654. Program doesn't coming under any */
/* lincense or warranty. If you have any questions, let write them */
/* to me sith@wifistar.net. Mny thks to J. Pribramsky for his help */
#include < stdio.h>
#include < fcntl.h>
#include < termios.h>
#include < sys/ioctl.h>
#include < time.h>
#define SERIAK "/dev/ttyS1"
//#define DEBUG
//#define JEDNOTKA
int ctsvalue (int fd);
long frekvence (int fd);
int
ctsvalue (int fd)
{
int status;
ioctl (fd, TIOCMGET, &status);
return (status & TIOCM_CTS);
}
long
frekvence (int fd)
{
int tiku = 0, cas = 0;
clock_t start, end;
ioctl (fd, TIOCMIWAIT, TIOCM_CTS); //az Hi
start = clock (); // stav hodin pred spustenim citace
do
{
if (ctsvalue (fd)) // pokud CTS Hi
{
tiku++;
while (ctsvalue (fd)) ; // cekam na CTS Low.
}
end = clock ();
cas = (end - start); // celkovy cas mereni
}
while (cas < CLOCKS_PER_SEC); //... pocet tiku/sec
#ifdef DEBUG
printf ("Pocet tiku:%d ", tiku);
#endif
return tiku; // frekvence v Hz
}
int
main (void)
{
int napeti = 0;
int fd = open (SERIAK, O_RDWR | O_NOCTTY);
if (fd < 0)
{
printf ("Port \"%s\" nelze zinicializovat.", SERIAK);
return 0;
}
napeti = (frekvence (fd)) / 10;
printf ("%d", napeti);
#ifdef JEDNOTKA
printf ("mV\n");
#endif
close (fd); //zavri seriak
return 0;
}
// radsi to zatim nigdo nezkousejte naostro, pac chybi:
// -dopsat delay v mereni()
// -dodelam jak budu mit chut, sith @ wifistar . net
#include < stdio.h>
#include < fcntl.h>
#include < termios.h>
#include < sys/ioctl.h>
#include < time.h>
#define SERIAK "/dev/ttyS1"
void power (unsigned short level);
int openserial ();
void closeserial ();
void RTS (unsigned short level);
void DTR (unsigned short level);
int CTS ();
float mereni ();
int fd;
void
power (unsigned short level) //napajeni pro prevodnik
{
int status;
ioctl (fd, TIOCMGET, &status);
if (level == 0)
ioctl (fd, TIOCSBRK, &status);
else
(fd, TIOCCBRK, &status);
ioctl (fd, TIOCMSET, &status);
}
int
openserial () //otevrit seriak
{
if ((fd = open (SERIAK, O_RDWR)) == -1)
{
return 0;
}
return 1;
}
void
closeserial () //zavrit seriak
{
close (fd);
}
void
RTS (unsigned short level) //nastav stav RTS
{
int status;
ioctl (fd, TIOCMGET, &status);
if (level)
{
status |= TIOCM_RTS;
}
else
{
status &= ~TIOCM_RTS;
}
ioctl (fd, TIOCMSET, &status);
}
void
DTR (unsigned short level) //nastav stav DTR
{
int status;
ioctl (fd, TIOCMGET, &status);
if (level)
{
status |= TIOCM_DTR;
}
else
{
status &= ~TIOCM_DTR;
}
ioctl (fd, TIOCMSET, &status);
}
int
CTS () //stav CTS
{
int status;
ioctl (fd, TIOCMGET, &status);
//ioctl (fd, TIOCMIWAIT, TIOCM_CTS);
return (status & TIOCM_CTS);
}
void
wait (int wait) //cekej x ms
{
int cas;
clock_t start, end;
wait *= 0.001;
start = clock ();
do
{
end = clock ();
cas = end - start;
}
while (cas < (CLOCKS_PER_SEC * wait));
}
float
mereni () //hlavni fce, mereni napeti
{
RTS (1); //CS
int status, bity = 128, cas = 0, hodnota = 0, i; //bity tzn jake rozliseni ma prevodnik 2^x
float mereni = 0.0;
wait (20); //x msec
RTS (0); //CS
for (i = 0; i < 8; i++) //konecne hot stuff ;)
{
if (CTS ())
hodnota += bity;
DTR (0); //clock
DTR (1); //clock
bity /= 2;
wait (20);
}
return (mereni = (float) hodnota / 50.0);
}
int
main ()
{
float napeti = 0.0;
short unsigned i;
if (!openserial ())
{
printf ("Nelze inicializovat port \"s\".", SERIAK);
return 0;
}
power (0); //txd break on
wait (10);
DTR (0); //clock
RTS (0); //CS
wait (10);
for (i = 0; i < 40; i++)
{
napeti += mereni ();
}
wait (10);
napeti = (napeti * 1000) / i;
printf ("\r%d mV", (int) napeti);
power (1); //txd break off
closeserial ();
return 0;
}
K čemu je ve funkci main() dobré to druhé volání wait(10) ? Zbytečně to zdržuje, no ne?
Puvodne to mela byt jakasi doba zotaveni ad prevodniku, ale funguje to i tak, bez toho.
Co se týče tvých funkcí RTS() a DTR() - není nutné v nich zjišťovat stav bitů. Pro tento účel je vhodnější použít volání TIOCMBIS/TIOCMBIC, které nastaví/nuluje příslušné bity. Například
ioctl(fd, TIOCMBIS, &TIOCM_DTR); /* nastaví DTR */
ioctl(fd, TIOCMBIC, &TIOCM_DTR); /* nuluje DTR */
Supr, zase dalsi zrychleni prace..
Mohl bys vysvětlit funkci power()? Odkud vlastně bereš napájení? Někde tam vypadlo "ioctl". K čemu je tam to TIOCSBRK?
Zkousel jsem to z TxD pinu, ale nestacilo to, napeti bylo male a ad prevodnik nefungoval korektne - jediny volny vystupni pin. A zapojovat shift registr se mi nechtelo . TIOCSBRK nahodi txd na log 0, TIOCCBRK na log 1 - BREAK.
0k, pro priste uz to bude podle obvyklych pravidel :o). S RS232 delam tyden, takze to skalopevne vryto do pameti zatim nemam. Prevodnik ma oznaceni TLC549 a je 8bit, v GM asi 60Kc. Je to moc draha sranda a oproti attiny, co jsem vcera konecne koupil, fakt nepomer.
Ahoj, oživuji téma jelikož řeším stejný problém, tento céčkový prográmek jsem si zkompiloval, ale i když spojím v rs232 kontakt např. mezi CTS a DTR tak se nestane nic. Hodnoty jsou stále stejné, tedy jsou to tyto: LE 1, DTR 2, RTS 4, CTS 32, CAR 64
Používám Ubuntu 12.10 Linux 3.5.0-29-generic, ale rs232 port je v pořádku, jelikož jej jinak používám s home-brew ir receivrem pro dálkové ovládání.
ls -lart /dev/ttyS0
crw-rw-rw- 1 root dialout 4, 64 May 9 00:53 /dev/ttyS0
Můžete mě nakopnout kupředu? :D Plácám se v tom.
Nejpraktictejsi mi prislo Serial Programming Guide for POSIX Operating Systems, viz kapitola 4, odstavec "Getting the Control Signals". Pak jsem jeste narazil na linuxove Serial Programming HOWTO, ale to mi tak dobre neprislo.
Na každé straně bych chtěl mít na jednom výstupním pinu neustále 0 jako referenciTa už tam je na pinu 5, viz http://rs232.hw.cz Jinak chápu to dobře, že chceš mít vstup i výstup na stejném pinu? Z těch obrázků bych totiž řekl, že obyčejný sériák nemá žádný obousměrný pin.
"Jinak chápu to dobře, že chceš mít vstup i výstup na stejném pinu? Z těch obrázků bych totiž řekl, že obyčejný sériák nemá žádný obousměrný pin."Nechci, a ani já nevěřím v existenci obousměrných pinů. Ty výstupní piny jsou tři, vstupních je 5 (počítám i stavové), pinů mám víc než dost.
Na každé straně bych chtěl mít na jednom výstupním pinu neustále 0 jako referenci Ta už tam je na pinu 5, viz http://rs232.hw.czTo chcete říct, že na 5. pinu je 12V a když ho spojím s RxD, bude to bráno jako příchod signálu?
To chcete říct, že na 5. pinu je 12V a když ho spojím s RxD, bude to bráno jako příchod signálu?Já jsem pochopil 0 jako 0V, moje chyba. Takže připojení pinu 5 na RxD samozřejmě jako příchod signálu bráno nebude. Nicméně nechápu, na co tu referenci? AFAIK se signál vyhodnocuje proti nule/zemi. Pokud budeš navrhovat své vlastní zařízení, tak to teda můžeš udělat, jak chceš, ale na straně počítače ti ta reference IMHO nebude k ničemu.
Nicméně nechápu, na co tu referenci? AFAIK se signál vyhodnocuje proti nule/zemi. Pokud budeš navrhovat své vlastní zařízení, tak to teda můžeš udělat, jak chceš, ale na straně počítače ti ta reference IMHO nebude k ničemu.Já budu používat laserové diody a dioda potřebuje napájení 2,5V (zhruba) z povolenou odchylkou 0.25V v obou směrech. Seriový port používá 12V (u notebooku 6V). Ve svém obvodu prostě nebudu mít zdroj 12V. Jde to vyřešit nějakým MAXem (takto jsem to už viděl na jakýchsi anglických stránkách), nebo na jednom výstupním pinu mít neustále 12V a v případě příchodu signálu na fotodiodu tento pin propojit (pomocí tranzistoru) s RxD. A dále: myslíte si, že by bylo výhodné použít TUN? Na počítači bych nechal běžet proces, který vyčítá seriový port a data chrlí do /dev/tun (a naopak). A jak se liší jaderný modul od obyčejného programu (komunikujícího se seriovým portem a tun zařízením)? Pokud by rozdíly nebyly příliš velké, nevidím jedniný důvod, proč si nevytvořit modul.
int f1,f2,l,fm;A jak je možné čekat na možnost čtení ze seriového portu? Stačí si třeba jako f1 otevřít /dev/ttyS0? A co pokud si chci hlídat nejen RxD, ale i další stavové piny?
f1 = open(buf, O_RDWR);
f2 = open(buf2, O_RDWR);
fm = max(f1, f2) + 1; //max vrátí vyšší číslo z předaných
while(1){
FD_ZERO(&fds); // Nestačilo by tento blok volat jen jednou, mimo while?
FD_SET(f1, &fds);
FD_SET(f2, &fds);
select(fm, &fds, NULL, NULL, NULL); // Jaký význam zde má to fm?
// a čtení ...
}
Co máš proti přeposílání na /dev/tun?Přijde mi to jako pitomost - posuď sám: 1) kernel obslouží událost přijatého byte ze sériového portu a ten byte vybere. Následně oživí tvůj program ze spánku signálem SIGIO 2) program si vybere přijatý byte (nebo víc bytů, pokud kernel bude bufferovat a počká, až toho přijde víc), nějak je zpracuje a pošle na /dev/tun 3) kernel si data přebere a něco s nimi udělá - např. probudí jiný (nebo i stejný) program ze spánku s tím, že přišla data ze sítě; bude přijatá data routovat, apod. Když použiješ PPP: 1) kernel přijme byte, pak další atd. než z toho seskládá nějaká platná data. Potom udělá to samé, co v bodě 3) v předchozím případě. Směrováním na /dev/tun přehazuješ data zbytečně tam a zpátky. Navíc ten tvůj program poběží v userspace, takže mu kernel nemusí vždy přidělit systémový čas a objeví se ti tam latence. Přiznávám, že to nevím jistě, ale mám ten dojem, že při použití PPP bys k tomu zařízení z programu přistupoval jako k síťovému interface ppp0, nikoliv jako k /dev/ttySn. K tomu kódu: k popisu otevřeného souboru se používá tzv. file descriptor, což je 32bitové celé číslo. To
fm
je číslo, které odpovídá nejvyššímu file descriptoru předávanému funkci select(), +1
A PPP používá jenom piny RxD a TxD?Předpokládám, že pro PPP se dá použít RTS/CTS řízení toku. To znamená, že když spojíš piny 7,8 na portu podle toho obrázku, na který jsem dával odkaz výš, tak jediné, co budeš muset propojit mezi počítači jsou piny RxD a TxD. Vyhledej si někde (třeba tady, jak funguje IrDA, z toho pravděpodobně pochopíš víc, než z mýho zmatenýho vysvětlování
...ale pak bych nemusel psát žádný program, PPP udělá všechno za mě.Jo. Pokud to chceš k něčemu použít, tak si ušetříš práci. Pokud si chceš zkusit, jestli se ti to podaří naprogramovat, tak ti samozřejmě nic nebrání. To vlastně odpovídá i na to přeposílání - pokud to chceš vyřešit po svém, tak je na tobě, jak to uděláš.
Tiskni
Sdílej: