🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.os.linux.programowanie
6 messages
6 total messages Started by Krzysiek Fri, 12 Dec 2014 10:39
tty0tty
#72719
Author: Krzysiek
Date: Fri, 12 Dec 2014 10:39
291 lines
7249 bytes
Witam!

Mam potrzebę podglądnąć transmisję po rs232.
Oczywiście pierwsze co zrobiłem to szukałem odpowiednich programów,
ale z mizernym rezultatem.
Znalazłem coś takiego:
http://jpnevulator.snarl.nl/

ale niestety to u mnie nie działa.
Tzn. mam urządzenie podpięte do portu z którym się normalnie dogaduję
z programu na PC i którego transmisję chcę podglądnąć, ale po
uruchomieniu powyższego już transmisja pada i urządzenia się nie
dogadują w ogóle.

Znalazłem jeszcze dwie możliwości tzn. socat i tty0tty,
ale one tworzą dwa wirtualne porty szeregowe, które mogą służyć
do testowania komunikacji pomiędzy dwoma aplikacjami na PC,
ale nie umożliwiają wyświetlania tego co się tam przesyła pomiędzy nimi
i nie umożliwiają podpięcie się pod rzeczywisty fizyczny port
(no, chyba że ja czegoś nie doczytałem).

Poszedłem więc inną drogą (być może błędną) i przerobiłem program
tty0tty, tak aby otwierał jeden rzeczywisty port, a drugi na
pseudoterminalu, a w międzyczasie wypluwał na konsolę to co się tam
pojawia.

Tyle, że coś mi tam jeszcze szwankuję i nie mogę dojść o co chodzi.

Źródła nie są długie, więc je wkleję w całości:

> gcc -Wall -O2 -D_GNU_SOURCE tty0tty.c -o tty0tty

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/select.h>
#include <errno.h>

#include <termio.h>


#define RED 31
#define GREEN 32
#define YELLOW 33
#define BLUE 34


static unsigned char buffer[1024];


void Reset()
{
	printf ("%c[%d ",0x1B,0); // przywrocenie kolorow na konsoli

}


	int
ptym_open(char *pts_name, char *pts_name_s , int pts_namesz)
{
	char    *ptr;
	int     fdm;

	strncpy(pts_name, "/dev/ptmx", pts_namesz);
	pts_name[pts_namesz - 1] = '\0';

	fdm = posix_openpt(O_RDWR | O_NONBLOCK);
	if (fdm < 0)
		return(-1);
	if (grantpt(fdm) < 0)
	{
		close(fdm);
		return(-2);
	}
	if (unlockpt(fdm) < 0)
	{
		close(fdm);
		return(-3);
	}
	if ((ptr = ptsname(fdm)) == NULL)
	{
		close(fdm);
		return(-4);
	}

	strncpy(pts_name_s, ptr, pts_namesz);
	pts_name[pts_namesz - 1] = '\0';

	return(fdm);
}


	int
conf_ser(int serialDev)
{

	int rc;
	struct termios params;

	// Get terminal atributes
	rc = tcgetattr(serialDev, &params);

	// Modify terminal attributes
	cfmakeraw(&params);

	rc = cfsetispeed(&params, B115200);

	rc = cfsetospeed(&params, B115200);

	// CREAD - Enable port to read data
	// CLOCAL - Ignore modem control lines
	params.c_cflag |= (B115200 |CS8 | CLOCAL | CREAD);

	// Make Read Blocking
	//fcntl(serialDev, F_SETFL, 0);

	// Set serial attributes
	rc = tcsetattr(serialDev, TCSANOW, &params);

	// Flush serial device of both non-transmitted
	// output data and non-read input data....
	tcflush(serialDev, TCIOFLUSH);


	return EXIT_SUCCESS;
}

	void
copydata(int fdfrom, int fdto)
{
	ssize_t br, bw;
	unsigned char *pbuf = buffer;
	unsigned char i;
	br = read(fdfrom, buffer, 1024);
	if (br < 0)
	{
		fprintf(stderr, "BR=%d, errno=%d\n", br, errno);
		if (errno == EAGAIN || errno == EIO)
		{
			br = 0;
		}
		else
		{
			perror("read");
			exit(1);
		}
	}
	if (br > 0)
	{
		fprintf(stderr,"Copydate:%d B\n",br );
		for (i=0; i< br; i++)
		{
			fprintf(stderr, " %02x", buffer[i]);


		}
		putc('\n', stderr);
		do
		{
			do
			{
				bw = write(fdto, pbuf, br);
				if (bw > 0)
				{
					pbuf += bw;
					br -= bw;
				}
			} while (br > 0 && bw > 0);
		} while (bw < 0 && errno == EAGAIN);
		if (bw <= 0)
		{
			// kernel buffer may be full, but we can recover
			fprintf(stderr, "Write error, br=%d bw=%d\n", br, bw);
			usleep(500000);
			// discard input
			while (read(fdfrom, buffer, 1024) > 0)
				;
		}
	}
	else
	{
		usleep(100000);
	}
}

int main(int argc, char* argv[])
{
	char master1[1024];
	char slave1[1024]="/dev/ttyUSB0";
	char master2[1024];
	char slave2[1024];

	int fd1;
	int fd2;

	fd_set rfds;
	int retval;

	//fd1=ptym_open(master1,slave1,1024);
	fd1=open(slave1,O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);

	fd2=ptym_open(master2,slave2,1024);

	if (argc >= 3)
	{
		//unlink(argv[1]);
		unlink(argv[2]);
		/*  if (symlink(slave1, argv[1]) < 0)
		    {
		    fprintf(stderr, "Cannot create: %s\n", argv[1]);
		    return 1;
		    }
		 */

		if (symlink(slave2, argv[2]) < 0) {
			fprintf(stderr, "Cannot create: %s\n", argv[2]);
			return 1;
		}
		printf("(%s) <=> (%s)\n",argv[1],argv[2]);
	}
	else {
		printf("(%s) <=> (%s)\n",slave1,slave2);
	}

	conf_ser(fd1);
	conf_ser(fd2);

	while(1)
	{
		FD_ZERO(&rfds);
		FD_SET(fd1, &rfds);
		FD_SET(fd2, &rfds);

		retval = select(fd2 + 1, &rfds, NULL, NULL, NULL);
		if (retval == -1)
		{
			perror("select");
			return 1;
		}
		if (FD_ISSET(fd1, &rfds))
		{
			fprintf(stderr,"%c[%dm%s -> %s\n",0x1B,RED, slave1, slave2);
			copydata(fd1, fd2);
		}
		if (FD_ISSET(fd2, &rfds))
		{
			fprintf(stderr,"%c[%dm%s -> %s\n", 0x1B,BLUE, slave2, slave1);
			copydata(fd2, fd1);
		}
	}
	Reset();
	close(fd1);
	close(fd2);

	return EXIT_SUCCESS;
}


Otóż jak podepnę swoje urządzenie do /dev/ttyUSB0, a z drugiej strony do
pseudoterminala /dev/pts/2 CuteCom to dogaduję się ze swoim urządzeniem
wysyłanymi komendami. Pierwszy problem zaczyna się w momencie kiedy na
terminalu CuteCom odłączam się od pseudoterminalu za pomocą "Close
device" - czyli zwalniam port.
Wtedy na ekran zaczyna wypluwać mi komunikat, który wynika z treści
mojego przerobionego programu:

/dev/pts/2 -> /dev/ttyUSB0
/dev/pts/2 -> /dev/ttyUSB0
/dev/pts/2 -> /dev/ttyUSB0
/dev/pts/2 -> /dev/ttyUSB0
/dev/pts/2 -> /dev/ttyUSB0
(...) itd całe ekrany

dopiero CTRL-C to kończy.

Nie jestem programistą i nie znam wszystkich niuansów konfiguracji
komunikacji szeregowej stąd ten post.
Dzieje się tak z każdym programem, który podpinam do /dev/pts/2
i przy zamknięciu połączenia zaczyna się zapełnianie ekranu
powyższym komunikatem.

Inna sprawa, że o ile z terminala potrafię się dogadać ze swoim
urządzeniem o tyle jak odpalę dedykowany program (nie moje dzieło)
to też nie mam komunikacji. No, ale nie wszystko na raz.

Gdyby się ktoś coś dopatrzył to byłbym wdzięczny.


Pozdrawiam
Re: tty0tty
#72720
Author: Sebastian Biały
Date: Fri, 12 Dec 2014 16:24
6 lines
1178 bytes
On 2014-12-12 11:39, Krzysiek wrote:
> Mam potrzebę podglądnąć transmisję po rs232.

Hardwareowo: możesz to zrobic biorąc drugi port RS232 i podpiając jego 
wejście do jednego z przewodów zaleznie od interesującego kierunku. Mają 
dwa dodatkowe widzisz całość real time.
Re: tty0tty
#72721
Author: Krzysiek
Date: Mon, 15 Dec 2014 07:35
20 lines
1853 bytes
W dniu 2014-12-12 17:24, Sebastian Biały pisze:
> On 2014-12-12 11:39, Krzysiek wrote:
>> Mam potrzebę podglądnąć transmisję po rs232.
> 
> Hardwareowo: możesz to zrobic biorąc drugi port RS232 i podpiając jego
> wejście do jednego z przewodów zaleznie od interesującego kierunku. Mają
> dwa dodatkowe widzisz całość real time.
> 
Tak, wiem, ale jest to nieco problematyczne, bo o ile
jeszcze porów USB na tyle znajdę, to muszę to robić na poziomie
TTL za układem FTDI, gdyż podglądanego RS'a mam na konwerterze.
Więc musiał bym dorobić jeszcze nieco elektroniki do tego.
No, ale w sumie też chciałbym wiedzieć dlaczego mi to nie działa ;-)

Od biedy to mogę zapiąć ten wynalazek:
http://allegro.pl/analizator-stanow-logicznych-saleae-8-kanalow-fv-i4898547042.html

na te kilkanaście bajtów wystarczy.

Pozdrawiam
Re: tty0tty
#72722
Author: Sebastian Biały
Date: Mon, 15 Dec 2014 07:46
30 lines
2354 bytes
On 2014-12-15 08:35, Krzysiek wrote:
> Tak, wiem, ale jest to nieco problematyczne, bo o ile
> jeszcze porów USB na tyle znajdę, to muszę to robić na poziomie
> TTL za układem FTDI

Zainteresuj się tym:

http://allegro.pl/kabel-usb-nokia-ca-42-3100-6100-6610-5140-pl-2023-i4788752787.html

Po odcięciu końcowki od strony telefonu dostaniesz standardowy UART na 
USB. Co prawda 3.3V ale ponieważ chcesz tylko czytać to dioda zenera + 
rezystor na wejściu załatwi problem.

> Od biedy to mogę zapiąć ten wynalazek:
> http://allegro.pl/analizator-stanow-logicznych-saleae-8-kanalow-fv-i4898547042.html
> na te kilkanaście bajtów wystarczy.

Ten analizator jest obleśny. Najgorsze że oprogramowanie podobno jest 
tworzone od wielu lat, ale po minucie obcowania z tym wynalazkiem jestes 
pewny że przeciętny student na kacu napisze lepsze. W głowie mi się nie 
mieści że mozna napisać tak upierdliwy software i to sprzedawać (i 
ludzie kupują!). Nie polecam [1].

Mała uwaga: to podróba oryginalnego hardware, zassanie oprogramowania 
saleae i używanie jest podejrzanie moralne a może i prawnie.

[1] Nie znalazłem jeszcze "działajacego" software do analizatorów 
logicznych. Każdy, wliczając to bajecznie drogie, jest do dupy. Co za 
czasy :/ Może mam za wysokie wymagania i liczę na funkcjonalnośc a nie 
kolorowe ikonki, nie wiem.
Re: tty0tty
#72723
Author: Krzysiek
Date: Mon, 15 Dec 2014 08:10
22 lines
2233 bytes
W dniu 2014-12-15 08:46, Sebastian Biały pisze:
> On 2014-12-15 08:35, Krzysiek wrote:

(...)
> Ten analizator jest obleśny. Najgorsze że oprogramowanie podobno jest
> tworzone od wielu lat, ale po minucie obcowania z tym wynalazkiem jestes
> pewny że przeciętny student na kacu napisze lepsze. W głowie mi się nie
> mieści że mozna napisać tak upierdliwy software i to sprzedawać (i
> ludzie kupują!). Nie polecam [1].
> 
> Mała uwaga: to podróba oryginalnego hardware, zassanie oprogramowania
> saleae i używanie jest podejrzanie moralne a może i prawnie.
> 
> [1] Nie znalazłem jeszcze "działajacego" software do analizatorów
> logicznych. Każdy, wliczając to bajecznie drogie, jest do dupy. Co za
> czasy :/ Może mam za wysokie wymagania i liczę na funkcjonalnośc a nie
> kolorowe ikonki, nie wiem.

Jest niby alternatywny program, ale mam wrażenie, że jest jeszcze mniej
przyjazny niż ten od saleae.

http://marcusjenkins.com/linux/saleae-logic-analyser-clone-with-ubuntu/
Re: tty0tty
#72724
Author: Lukasz Czarnowski
Date: Fri, 02 Jan 2015 19:51
28 lines
1680 bytes
On Fri, 12 Dec 2014 11:39:57 +0100
Krzysiek <kris_gor@poczta.onet.pl> wrote:

> Mam potrzebę podglądnąć transmisję po rs232.
> Oczywiście pierwsze co zrobiłem to szukałem odpowiednich programów,
> ale z mizernym rezultatem.
> Znalazłem coś takiego:
> http://jpnevulator.snarl.nl/
> 
> ale niestety to u mnie nie działa.
> Tzn. mam urządzenie podpięte do portu z którym się normalnie dogaduję
> z programu na PC i którego transmisję chcę podglądnąć, ale po
> uruchomieniu powyższego już transmisja pada i urządzenia się nie
> dogadują w ogóle.


Trochę późno odpowiadam, ale swego czasu do analizy komunikacji
zamkniętego softu z UPS wystarczył mi `strace', gdzie znalazłem
to co interesujące:

"""
write(4, "Q1\r", 3)                     = 3
read(4, "(239.8 190.0 230.7 025 50.0 2.24"..., 64) = 47
"""

Pozdrawiam
-- 
Łukasz Czarnowski
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads