Byla vydána nová major verze 5.0.0 svobodného multiplatformního nástroje BleachBit (GitHub, Wikipedie) určeného především k efektivnímu čištění disku od nepotřebných souborů.
Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za duben (YouTube).
Provozovatel čínské sociální sítě TikTok dostal v Evropské unii pokutu 530 milionů eur (13,2 miliardy Kč) za nedostatky při ochraně osobních údajů. Ve svém oznámení to dnes uvedla irská Komise pro ochranu údajů (DPC), která jedná jménem EU. Zároveň TikToku nařídila, že pokud správu dat neuvede do šesti měsíců do souladu s požadavky, musí přestat posílat data o unijních uživatelích do Číny. TikTok uvedl, že se proti rozhodnutí odvolá.
Společnost JetBrains uvolnila Mellum, tj. svůj velký jazykový model (LLM) pro vývojáře, jako open source. Mellum podporuje programovací jazyky Java, Kotlin, Python, Go, PHP, C, C++, C#, JavaScript, TypeScript, CSS, HTML, Rust a Ruby.
Vývojáři Kali Linuxu upozorňují na nový klíč pro podepisování balíčků. K původnímu klíči ztratili přístup.
V březnu loňského roku přestal být Redis svobodný. Společnost Redis Labs jej přelicencovala z licence BSD na nesvobodné licence Redis Source Available License (RSALv2) a Server Side Public License (SSPLv1). Hned o pár dní později vznikly svobodné forky Redisu s názvy Valkey a Redict. Dnes bylo oznámeno, že Redis je opět svobodný. S nejnovější verzí 8 je k dispozici také pod licencí AGPLv3.
Oficiální ceny Raspberry Pi Compute Modulů 4 klesly o 5 dolarů (4 GB varianty), respektive o 10 dolarů (8 GB varianty).
Byla vydána beta verze openSUSE Leap 16. Ve výchozím nastavení s novým instalátorem Agama.
Devadesátková hra Brány Skeldalu prošla portací a je dostupná na platformě Steam. Vyšel i parádní blog autora o portaci na moderní systémy a platformy včetně Linuxu.
Lidi dělají divné věci. Například spouští Linux v Excelu. Využít je emulátor RISC-V mini-rv32ima sestavený jako knihovna DLL, která je volaná z makra VBA (Visual Basic for Applications).
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: