Serial Port listener


TuiTi


Salutare,

Am o mica problema legata de "ascultarea" datelor ce imi curg pe portul serial.
Am un PBX conectat la un calculator pe serial(com1) si respectiva cutie imi ruleaza un linux - CentOS.

Folosirea minicom(pentru a prinde datele de pe serial) a cam iesit din discutie fiindca nu prea stie sa ruleze in fundal.

Asa ca am apelat la o aplicatie facuta in C++(cred) biggrin.gif

cod sursa:

CODSURSA
#include <fcntl.h>
#include <stdio.h>
#include <termios.h>
#include <stdlib.h>
#include <strings.h>

/* Setez baud rate */
#define SPEED B19200

/* Setez portul serial */
#define PORT "/dev/ttyS0"

int main( ){
    int fd = open( PORT, O_RDONLY | O_NOCTTY );
    if (fd <0) {perror(PORT); exit(-1); }
    struct termios options;
    
    bzero(&options, sizeof(options));
    options.c_cflag = SPEED | CS8 | CLOCAL | CREAD | IGNPAR;
    tcflush(fd, TCIFLUSH);
    tcsetattr(fd, TCSANOW, &options);
                            
    int r;
    char buf[255];
    while( 1 ){
        r = read( fd, buf, 255 );
        buf[r]=0;
        printf( "%s", buf );
    }
}


Am gasit sursa pe internet si as vrea sa o adaptez cumva pentru nevoile mele

Sunt total necunoscator in acest limbaj si ma intreb cum pot face sa scriu acele date care mi le scoate in stdout sau in "ecran" dupa intelesul meu, fie intr-o baza de date sau intr-un fisier text.

Tin sa precizez ca este vorba de inregistrari SMDR care apar ceva in genul asta:

22/10/09 16:09 103 11 0777777777 00:00'31 00000.00
22/10/09 16:11 107 10 0777777777 00:00'42 00000.00
22/10/09 16:11 110 10 0777777777 00:00'16 00000.00
22/10/09 16:12 108 11 0777777777 00:02'56 00000.00
22/10/09 16:14 110 11 0777777777 00:00'51 00000.00
22/10/09 16:17 106 11 0777777777 00:00'29 00000.00
22/10/09 16:19 106 11 0777777777 00:00'25 00000.00
22/10/09 16:19 107 10 0777777777 00:01'01 00000.00


unde 0777777777 variaza fiind un numar de telefon format.


multumesc anticipat pentru orice sugestie.
senoctar
Poti realiza acest lucru fara cunostinte de C++.
Consola windows suporta redirectare, deci orice iesire la consola a unui program o poti redirecta intr-un fisier asa :
CODSURSA
comanda > fisier.txt

LE: am uitat ca esti pe linux, oricum si bash suporta acest tip de redirectare
 
TuiTi
CITAT (senoctar @ 22nd October 2009, 17:21) *
Poti realiza acest lucru fara cunostinte de C++.
Consola windows suporta redirectare, deci orice iesire la consola a unui program o poti redirecta intr-un fisier asa :
CODSURSA
comanda > fisier.txt

LE: am uitat ca esti pe linux, oricum si bash suporta acest tip de redirectare


am incercat deja asa si nu imi arunca nimic in fisierul respectiv

./serialcap > calls.txt

sau

./serialcap > calls.txt


si nimic.

serialcap e aplicatia compilata.

daca o folosesc fara sa ii cer sa verse in txt merge, imi scoate pe ecran tot ce intra pe ttyS0

dar ideal este sa fac asta in background ...

./serialcap > calls.txt&


ceea ce nu vrea ...
OriginalCopy
Poate afiseaza prin stderr nu stdout. Redirecteaza si stderr.
TuiTi
CITAT (OriginalCopy @ 22nd October 2009, 19:24) *
Poate afiseaza prin stderr nu stdout. Redirecteaza si stderr.



stderr .. chineza pentru mine

poti te rog sa imi explici mai exact cam ce trebuie sa fac sa verific asta ?
senoctar
CITAT (TuiTi @ 22nd October 2009, 19:27) *
stderr .. chineza pentru mine

poti te rog sa imi explici mai exact cam ce trebuie sa fac sa verific asta ?


http://sn.ro/yj8vvq4
TuiTi
nu prea imi functioneaza pagina respectiva.

404 - Not found
 
senoctar
CITAT (TuiTi @ 23rd October 2009, 11:31) *
nu prea imi functioneaza pagina respectiva.

404 - Not found


Curios cum de s-a inlocuit host-ul

http://www.sn.ro/yj8vvq4

Ce voiam sa spun prin asta este ca, sa redirectezi stdout trebuia sa pui doar caracterul ">", si ti s-a sugerat sa faci asta si pentru stderr, nu putea sa fie mult mai complicat, decat sa fi intrebat aici si sa astepti o zi raspunsul, puteai afla asta in cateva secunde.

LE: Iar se modifica url-ul, foloseam tinyurl, http://lmgtfy.com/?q=redirect+stderr+linux&l=1
TuiTi
ms de raspuns

atat stdout cat si stderr nu vor sa ajunga in log

./serialcap > logfile 2>&1

script log.txt
./serialcap

./serialcap 2> log.txt

./serialcap &> log.txt


nu vor sa functioneze..

probabil ca am o balarie in sursa .. nestiind C++ habar nu am cum se poate rezolva.


Multumesc anticipat pentru orice sugestie.
senoctar


In fine, nu stiu ce faci de nu iti merge, poate nu citesti ce trebuie, poate nu face flush prea des programul.
Compileaza si ruleaza codul asta fara vreun argument, apoi vezi ce gasesti in out.txt :

CODE

#include <fcntl.h>
#include <stdio.h>
#include <termios.h>
#include <stdlib.h>
#include <strings.h>

/* Setez baud rate */
#define SPEED B19200

/* Setez portul serial */
#define PORT "/dev/ttyS0"

int main( ){
int fd = open( PORT, O_RDONLY | O_NOCTTY );
if (fd <0) {perror(PORT); exit(-1); }
struct termios options;

bzero(&options, sizeof(options));
options.c_cflag = SPEED | CS8 | CLOCAL | CREAD | IGNPAR;
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &options);

FILE * pFile;
pFile = fopen ("out.txt","w");
if (NULL==pFile)
{
printf("can not open out.txt\n");
return 1;
}

int r;
char buf[255];
while( 1 ){
r = read( fd, buf, 255 );
buf[r]=0;
fwrite (buf , 1 , r , pFile );
fflush(pFile);
}
}
TuiTi
merci senoctar, o sa incerc si varianta ta.

Intre timp am rezolvat-o cu mai putin C++.

Am facut un script in bash ce imi ruleaza in background un tail -f pe /dev/ttyS0 si imi scrie output intr-un txt.

Revin cu detalii despre sursa ta dupa ce o compilez si testez.
Aceasta este o versiune simplificatã a paginii originale. Pentru a vizita versiunea originala click aici.