Periféria kezelés ?

 ( Ppali | 2003. május 18., vasárnap - 23:39 )

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Udv!

Azt szeretnem megkerdezni, hogy hogyan lehet megoldani (lehetoleg ansi) c-ben, hogy ha beker egy billentyut, akkor utanna ne kerjen enteret?
Peldaul, ha csinaltam egy olyan programot, amiben egy 80x25 -os konzolon lehet iranyitani egy 0-t, akkor hogy tudom hegcsinalni, hogy ez a "asdw" betukkel mukodjon?

Kosz!

szaszg: Kosz, ebbol szerintem mar menni fog!

Viszont nem tetszik ez az egesz hozzaallas, ami ezzel kapcsolatban ert...
Most akar hiszed, akar nem tenyleg eloszor en probaltam utannajarni a dolognak, aztan megkerdeztem egy felsobbevest, de az sem vezetett eredmenyre. Tudom (ahogy szinte mindenki :!: ), hogy angol tudas kell hozza, de ha nincs, akkor attol, hogy valaki 5 milliomodszorra leirja, hogy kell, attol meg nem lesz. Dolgozom rajta, de meg nincs.

Elszomorit a dolog, hogy latom, hogy bolldog bolldogtalan jon a beadando feladatsoraival minden forumra, amire hannyak az emberek a kesz forraskodot.
En egyszeruen tudni szerettem volna egy ilyet, amit vegulis csak a "tokeletesedesemre" hasznaltam volna fel, amire mar majdhogynem leb... az embert. Lehet, hogy neked ez egy egyszeru dolog, de azert koszonom, hogy toleralod, hogy egyaltalan kerdezek... :( Lehet, hogy nem igy akart kinezni a dolog, de nekem ez jott le.

vmiklos: Te lefuttadtad azt a programot? Gyanitom nem. De akkor miert irod be csak ugy?

Ez most nem flame, es nem megbantas akart lenni, de csak ket jotanacs: Neha nem art leszalni a magas lorol, meg akkor sem, ha joda van az embernek ott ulni. A masik, hogy kivanok hasonlo csaladias oktato hozzaszolasokat!

u.i.: Egyebkent tenyleg kosz a segitseget, azzal a forrassal szerintem megoldom a problemat!

[quote:5d00d10863="Anonymous"]vmiklos: Te lefuttadtad azt a programot? Gyanitom nem. De akkor miert irod be csak ugy?[/quote:5d00d10863]
Miert, hogy írja be? Egyébként én kifejezetten valószínűnek látom, hogy nem futtatta le, mert az volt benne hogy "<nemtommi az i kodja>" ami szintaktikailag nem nagyon helyes és nem valószínű hogy elfelejtette volna azóta amióta "lefuttatta" :D és sem [b:5d00d10863]main[/b:5d00d10863] függvény nincsen, sem pedig [b:5d00d10863]#include[/b:5d00d10863]-ok a program elején, ami a printf()-hez és a getch()-hez kéne. vmiklos csak egy példát írt, hogy hogyan tudod alkalmazni a dolgot. Egyébként ha programot írtál ebből a csodás föggvényből akkor [b:5d00d10863]-lncurses[/b:5d00d10863]-zal kell forditani, kell neki [b:5d00d10863]#include <curses.h>[/b:5d00d10863] és a program elejére kell még egy [b:5d00d10863]initscr();[/b:5d00d10863] is.
Egyebkent hogy ezeket elkeruljuk szerintem is praktikusabb hasznalni a getchar()-t, de mivel itt nagy valoszinuseggel ugy is fogjuk hasznalni az ncurses-t, szerintem tökmindegy hogy mivel kered be a billentyut. Ha netán a nyilakkal szeretnéd nyomni akkor a getch()-et használd, mert az int-et ad vissza, így lehet pl KEY_UP, KEY_RIGHT es tarsai.

Ajanlom figyelmedbe az "A C PROGRAMOZÁSI NYELV" könyvet Brian W. Kernnghan és Dennis M. Ritchie tollaiból.

[quote:5d00d10863="vmiklos"]while(1)
[code:1:5d00d10863] {
printf("A program licensze gpl.\n\n");
printf("Elfogadod [i/n]");
if (getch() == <nemtommi az i kodja>);
break;
} [/code:1:5d00d10863]

[i:5d00d10863]az i kodjat most nemtom kapasbol, ez addig kerdez, mig vegre elfogadod a licenszet[/i:5d00d10863][/quote:5d00d10863]
Ezt könnyen át lehet hidalni, ha [b:5d00d10863]if (getch() == 'i')[/b:5d00d10863]-t írsz :D

[quote:296229d046="Anonymous"]vmiklos: Te lefuttadtad azt a programot? Gyanitom nem. De akkor miert irod be csak ugy?
[/quote:296229d046]
természetesen nem, hiszen csak példának írtam be

Szeretnek elnezest kerni, kicsit feszult voltam az elobb... :roll:
Most mar minden ok, de tenyleg ne haragudjatok!

Sajnos ez nem sokat segített. Annyi ideje már foglalkozom a dolgokkal, hogy ha felmerül egy ilyen kérdésem, akkor elöször utánna nézek(könyvekben, mert angolul nem tudok...), aztán megkérdezek (személyesen...) okosabbakat, és ha ez sem segít, akkor megkérdezem pl. itt.

Azért köszönöm! Esetleg még valaki?

getch()? :wink:

Szeretnék látni vele egy forrásrészletet...
Mellesleg Te találtál valamit a man getch -ben?

Hi!

Bocs a hiperhosszu idezetert, de itt egy mukodo pelda:

/*------------------------------------------------------------------*
| Floppy/CDROM mounter applett |
| for console |
| using ansi seqs |
| By : Antiemes/TBS |
*__________________________________________________________________*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/mount.h>
/*-------------------------------------------------*/
#define KERETSZINE 32
#define FEJLECSZINE 33
#define CIMSZINE 37
#define ADATOKSZINE 36
#define MOUNTEDSZINE 32
#define UMOUNTEDSZINE 31
#define ACTIVESZINE 32
#define DEVICEKSZAMA 5
/*-------------------------------------------------*/
struct devss {int status; char *drive, *mntpt, *fs; int drvlen,dirlen,fslen;} devices[10];
struct termios saved_attributes;
/*-------------------------------------------------*/
clrscr ()
{
printf("");
}
/*-------------------------------------------------*/
void reset_input_mode (void) {
clrscr();
fflush(0);
tcsetattr(STDIN_FILENO, TCSANOW, &saved_attributes);
}
/*-------------------------------------------------*/
fel (v)
int v;
{
printf("[%dA",v);
}
/*-------------------------------------------------*/
le (v)
int v;
{
printf("[%dB",v);
}
/*-------------------------------------------------*/
bal (v)
int v;
{
printf("[%dD",v);
}
/*-------------------------------------------------*/
jobb (v)
int v;
{
printf("[%dC",v);
}
/*-------------------------------------------------*/
pxy (x,y)
int x,y;
{
printf("[%d;%dH",y,x);
}
/*-------------------------------------------------*/
savepos () {
printf("");
}
/*-------------------------------------------------*/
restorepos ()
{
printf("");
}
/*-------------------------------------------------*/
setcolor (col)
char col;
{
printf("[1;%dm",col);
}
/*-------------------------------------------------*/
textxy (x,y,col,txt)
int x,y;
unsigned char col;
char *txt;
{
pxy(x,y);
setcolor(col);
printf("%s",txt);
}
/*-------------------------------------------------*/
selon (pos)
int pos;
{
char csik[31]="==============================\0";

textxy(2,5+pos,ACTIVESZINE,"]>");
textxy(6+devices[pos].drvlen,5+pos,ACTIVESZINE,csik+devices[pos].drvlen+7);
textxy(4+devices[pos].drvlen,5+pos,ACTIVESZINE,"<[");
textxy(29,5+pos,ACTIVESZINE,"]>");
textxy(33+devices[pos].dirlen,5+pos,ACTIVESZINE,csik+devices[pos].dirlen+6);
textxy(31+devices[pos].dirlen,5+pos,ACTIVESZINE,"<[");
textxy(57,5+pos,ACTIVESZINE,"]>");
textxy(61+devices[pos].fslen,5+pos,ACTIVESZINE,csik+devices[pos].fslen+22);
textxy(59+devices[pos].fslen,5+pos,ACTIVESZINE,"<[");
textxy(69,5+pos,ACTIVESZINE,"]>");
textxy(devices[pos].status ? 73 : 74,5+pos,ACTIVESZINE,devices[pos].status ? "<[==":"<[=");
}
/*-------------------------------------------------*/
seloff (pos)
int pos;
{
char csik[31]=" \0";

textxy(2,5+pos,ACTIVESZINE," ");
textxy(6+devices[pos].drvlen,5+pos,ACTIVESZINE,csik+devices[pos].drvlen+7);
textxy(4+devices[pos].drvlen,5+pos,ACTIVESZINE," ");
textxy(29,5+pos,ACTIVESZINE," ");
textxy(33+devices[pos].dirlen,5+pos,ACTIVESZINE,csik+devices[pos].dirlen+6);
textxy(31+devices[pos].dirlen,5+pos,ACTIVESZINE," ");
textxy(57,5+pos,ACTIVESZINE," ");
textxy(61+devices[pos].fslen,5+pos,ACTIVESZINE,csik+devices[pos].fslen+22);
textxy(59+devices[pos].fslen,5+pos,ACTIVESZINE," ");
textxy(69,5+pos,ACTIVESZINE," ");
textxy(devices[pos].status ? 73 : 74,5+pos,ACTIVESZINE," ");
}
/*-------------------------------------------------*/
/*void billnyom () {
static char ch;
static short int mpos;
static short int esc,zarojel;

//read(STDIN_FILENO, &ch,1);
//if (ch=='') {
printf("Character.");

}*/
/*-------------------------------------------------*/
void set_input_mode (void) {
struct termios tattr;
long flax;
char *name;

tcgetattr(STDIN_FILENO,&saved_attributes);
atexit(reset_input_mode);

tcgetattr(STDIN_FILENO,&tattr);
tattr.c_lflag&=~(ICANON|ECHO);
tattr.c_cc[VMIN]=1;
tattr.c_cc[VTIME]=0;
tcsetattr(STDIN_FILENO, TCSAFLUSH, &tattr);
//fcntl(0,F_GETFL,flax);
//flax|=O_ASYNC;
//fcntl(0,F_SETFL,flax);
//signal(SIGIO,billnyom);
}
/*-------------------------------------------------*/
main (){
int i;
int kilep;
int mpos;
char ch;
char *fs_bigyo_data;

if (!isatty(STDIN_FILENO)) {
fprintf(stderr,"Not a terminal.");
exit(-1);
}
clrscr();
for (i=1; i<79; i++) {
textxy(i,0,KERETSZINE,"=");
textxy(i,24,KERETSZINE,"_");
}
for (i=1; i<24; i++) {
textxy(0,i,KERETSZINE,"|");
textxy(79,i,KERETSZINE,"|");
}
textxy( 0, 0,KERETSZINE,"/");
textxy(79, 0,KERETSZINE,"\\");
textxy( 0,24,KERETSZINE,"\\");
textxy(79,24,KERETSZINE,"/");
textxy(31,0,CIMSZINE,".:[ MounteR ]:.");
textxy(4,2,FEJLECSZINE,"________");
textxy(3,3,FEJLECSZINE,"[_Device_]");
textxy(31,2,FEJLECSZINE,"_____________");
textxy(30,3,FEJLECSZINE,"[_Mount Point_]");
textxy(59,2,FEJLECSZINE,"____");
textxy(58,3,FEJLECSZINE,"[_FS_]");
textxy(68,2,FEJLECSZINE,"________");
textxy(67,3,FEJLECSZINE,"[_Status_]");
// textxy(2,4,KERETSZINE,"_____________________________________________________________________________");
textxy(2,4,KERETSZINE,"-----------------------------------------------------------------------------");
// textxy(2,4+DEVICEKSZAMA,KERETSZINE,"_____________________________________________________________________________");
textxy(2,5+DEVICEKSZAMA,KERETSZINE,"-----------------------------------------------------------------------------");

devices[0].status=0;
devices[0].drive="/dev/fd0";
devices[0].mntpt="/floppy";
devices[0].fs="auto";
devices[1].status=0;
devices[1].drive="/dev/fd0";
devices[1].mntpt="/floppy/dos";
devices[1].fs="vfat";
devices[2].status=0;
devices[2].drive="/dev/fd0";
devices[2].mntpt="/floppy/a";
devices[2].fs="minix";
devices[3].status=0;
devices[3].drive="/dev/fd0";
devices[3].mntpt="/floppy/ext2";
devices[3].fs="ext2";
devices[4].status=0;
devices[4].drive="/dev/cdrom";
devices[4].mntpt="/cdrom";
devices[4].fs="iso9660";
for (i=0; i<DEVICEKSZAMA; i++) {
devices[i].drvlen=strlen(devices[i].drive);
devices[i].dirlen=strlen(devices[i].mntpt);
devices[i].fslen=strlen(devices[i].fs);
textxy(4,i+5,ADATOKSZINE,devices[i].drive);
textxy(31,i+5,ADATOKSZINE,devices[i].mntpt);
textxy(59,i+5,ADATOKSZINE,devices[i].fs);
textxy(71,i+5,devices[i].status ? MOUNTEDSZINE : UMOUNTEDSZINE,devices[i].status ? "on" : "off");
}
selon(0);
fflush(0);
kilep=0;
mpos=0;
set_input_mode();
do {
read(STDIN_FILENO, &ch,1);
if (ch==27) { //Esc
kilep=1;
read(STDIN_FILENO, &ch,1);
if (ch=='[') {
kilep=0;
read(STDIN_FILENO, &ch,1);
if ((ch=='B') && (mpos<(DEVICEKSZAMA-1))) {
seloff(mpos);
selon(++mpos);
fflush(0);
}
if ((ch=='A') && (mpos>0)) {
seloff(mpos);
selon(--mpos);
fflush(0);
}
}
}
if ((ch==' ')||(ch==0x0a)) { //Space vagy Enter
devices[mpos].status ? umount (devices[mpos].mntpt) : mount(devices[mpos].drive,devices[mpos].mntpt,devices[mpos].fs,0xc0ed,fs_bigyo_data);
/**drive, *mntpxt*/
devices[mpos].status=1-devices[mpos].status;
textxy(71,mpos+5,devices[mpos].status ? MOUNTEDSZINE : UMOUNTEDSZINE,devices[mpos].status ? "on" : "off");
selon(mpos);
fflush(0);
}
if (ch=='q') kilep=1;

}
while (!kilep);

}
/*-------------------------------------------------*/

Remelem, hogy nem torte nagyon szet a cuccot a forummotor, es hasznalhato a forras. Ha gondolod, akkor e-mailben is el tudom kuldeni.
Nem kell hozza ncurses.
Mellesleg szerintem egyaltalane nem baj, ha az ember kerdez. Speciel anno en se ertettem meg a manbol, hogy kell csinalni, en is ugy kerdeztem meg egy levlistan. (konkretan az L-code-l listan)

By(t)e
TBS::Antiemes

[quote:51165f8d9d="Anonymous"]Szeretnék látni vele egy forrásrészletet...
[/quote:51165f8d9d]
grep-available serial\ port |grep-dctrl libstdc

Az eredmenyben azok a debian csomagok vannak, amik soros portal, es C++-al kapcsolatosak. Amelyik megtetszik:
apt-get source ezkellnekem, es nezegesd kedvedre;-) (pl: hylafax-server)

[quote:325dd847f8="Anonymous"]Szeretnék látni vele egy forrásrészletet...
Mellesleg Te találtál valamit a man getch -ben?[/quote:325dd847f8]
[code:1:325dd847f8]while(1)
{
printf("A program licensze gpl.\n\n");
printf("Elfogadod [i/n]");
if (getch() == <nemtommi az i kodja>);
break;
}
[/code:1:325dd847f8]
az i kodjat most nemtom kapasbol, ez addig kerdez, mig vegre elfogadod a licenszet

ha valamit nem jól íram, akkor javítsatok ki

HUPP

[quote:ee51380b8c="Anonymous"]Udv!

Azt szeretnem megkerdezni, hogy hogyan lehet megoldani (lehetoleg ansi) c-ben, hogy ha beker egy billentyut, akkor utanna ne kerjen enteret?
Peldaul, ha csinaltam egy olyan programot, amiben egy 80x25 -os konzolon lehet iranyitani egy 0-t, akkor hogy tudom hegcsinalni, hogy ez a "asdw" betukkel mukodjon?

Kosz![/quote:ee51380b8c]
info libc
Node: Low-Level Terminal Interface

Zsiraf

RTFM

Üdv mindenkinek !

Én abban szeretnék segítséget kérni, hogyan kell C++ alatt perifériákat (konkrétan soros portot) kezelni ? Erre vonatkozóan ugyanis semmit se találtam az eddig kezembe került szakirodalmakban.
Autodidakta módon tanulgatom a programozás alapjait, egyszerű feladatokat már meg tudok oldani, de itt falnak ütköztem. Pedig egyedül ezért kezdtem bele. Egyébként mikrovezérlőkre írok assembly programokat és mivel gyakran merül fel a PC-s adatgyűjtés ill. adatfeldolgozás igénye, "magad uram, ha szolgád nincs" alapon kénytelen vagyok megtanulni ezt is. Nem kellenek különleges dolgok, egyszerűen a soros porton beküldök adatokat, ezt kell eltárolni, esetleg kiírni a képernyőre, valamint utólagosan statisztikákat készíteni ill. visszakeresni.
Szóval, ha valaki segítene, hol keressek ezzel kapcsolatos információkat, megköszönném.

Tisztelettel:
Ppali

Hali!

Valószínűleg, elég hasonlóan, mint C-ben: open, azután meg read, write. esetleg, egy kis ioctl.

Amúgy valahol van a neten egy Serial Programming HOWTO, (debian-on a HOWTOK között a Serial-Programming-HOWTO névre halgat) tessék rákeresni, valamint szíves figyelmedbe ajánlom a kernel forrásokat, a különbözö ioctl #define-khez.

Zsiráf

Hali Zsiráf !

Köszi az infókat, úgy tűnik ennyi kellett, hogy a homlokomra csapjak, mindig
elfelejtem, hogy operációs rendszert használva a dolgok lényegesen egyszerűbbek,
mint az ablakcsapkodás esetében.....
Szóval most, mielőtt még el kezdtem volna, érthetőnek tűnik a dolog, a bajok valószínűleg
később kezdődnek. Legfeljebb akkor újra kiabálok.
Minden jót, még egyszer köszi

Pali

[quote:4ea71707b2="Anonymous"]Sajnos ez nem sokat segített. Annyi ideje már foglalkozom a dolgokkal, hogy ha felmerül egy ilyen kérdésem, akkor elöször utánna nézek(könyvekben, mert angolul nem tudok...), aztán megkérdezek (személyesen...) okosabbakat, és ha ez sem segít, akkor megkérdezem pl. itt.

Azért köszönöm! Esetleg még valaki?[/quote:4ea71707b2]
Programozni angol nelkul nagyon nehezkes....

Ne vard, hogy leforditsam neked az egeszet.. Vegy a kezedbe szotart meg nemi
intelligenciat es hidd el ha akarod mindent megertesz...

Amugy ami teged erdekel:
[code:1:4ea71707b2]* Noncanon Example:: How to read single characters without echo.[/code:1:4ea71707b2]

Amugy nehez elhinnem, hogy nem jottel ra ha egy kicsit turkaltal az info libc-ben :-(

[code:1:4ea71707b2]
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>

/* Use this variable to remember original terminal attributes. */

struct termios saved_attributes;

void
reset_input_mode (void)
{
tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes);
}

void
set_input_mode (void)
{
struct termios tattr;
char *name;

/* Make sure stdin is a terminal. */
if (!isatty (STDIN_FILENO))
{
fprintf (stderr, "Not a terminal.\n");
exit (EXIT_FAILURE);
}

/* Save the terminal attributes so we can restore them later. */
tcgetattr (STDIN_FILENO, &saved_attributes);
atexit (reset_input_mode);

/* Set the funny terminal modes. */
tcgetattr (STDIN_FILENO, &tattr);
tattr.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
tattr.c_cc[VMIN] = 1;
tattr.c_cc[VTIME] = 0;
tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr);
}

int
main (void)
{
char c;

set_input_mode ();

while (1)
{
read (STDIN_FILENO, &c, 1);
if (c == '\004') /* `C-d' */
break;
else
putchar (c);
}

return EXIT_SUCCESS;
}

[/code:1:4ea71707b2]

Szoval, ha nem tudsz RTFM akkor nem sok jo var rad... :-(

Zsiraf

U.i.: Nem kell semmi C forrast-t bronzolni, eleg jol dokumentalt vilagos megmagyarazott peldaprogramokkal a libc. Csak olvasni tudni kell... :!:

[quote:c7bd26e73b="vmiklos"][quote:c7bd26e73b="Anonymous"]Szeretnék látni vele egy forrásrészletet...
Mellesleg Te találtál valamit a man getch -ben?[/quote:c7bd26e73b]
[code:1:c7bd26e73b]while(1)
{
printf("A program licensze gpl.\n\n");
printf("Elfogadod [i/n]");
if (getch() == <nemtommi az i kodja>);
break;
}
[/code:1:c7bd26e73b]
az i kodjat most nemtom kapasbol, ez addig kerdez, mig vegre elfogadod a licenszet

ha valamit nem jól íram, akkor javítsatok ki[/quote:c7bd26e73b]

Kedves vmiklos a getch az borland/microsoft kiegeszitese volt regen a c konyvtarnak... valszinuleg a *nix-os ncurses-bol vettek, ahol telleg egy erre valo fuggveny... Az 'i' kodja meg 105 vagy hexa 69...
A c konyvtarban a getchr van definialva, amit telleg egy karaktert olvas be, csak ehez nem valtoztatja meg a terminal bufferelesi tulajdonsagait....

Zsiraf