Portál AbcLinuxu, 10. května 2025 07:06

Dotaz: Pomoc se sériovým kanálem v c++

14.3.2010 21:06 Lyso
Pomoc se sériovým kanálem v c++
Přečteno: 276×
Odpovědět | Admin
Zdravím, mám takový menší problém. Programuju spojení mezi Aducem842 a Linuxem ( ubuntu ) pomocí RS232. Komunikaci mám vyřešenou tak, že vysílám tři znaky jednim směrem, tři znaky zpátky. Pořád dokola. Problém však nastane, když vyšlu 10, což je ASCII new line. Většinou mi při tom zkolabuje program v linuxu, tak že se přeruší komunikace.

Mám tušení, v tom že jsem nastavil špatně seriový kanal. Mohl by se tedy prosím na to někdo podívat ?

konfigurace kanálu:
 
                // Get the current options for the port...
		tcgetattr(fd, &options);

		// Set the baud rates to 38400...
		cfsetispeed(&options, B38400);
		cfsetospeed(&options, B38400);

		// Enable the receiver and set local mode...
		options.c_cflag |= (CLOCAL | CREAD);
		options.c_cflag &= ~PARENB;
		options.c_cflag &= ~CSTOPB;
		options.c_cflag &= ~CSIZE;
		options.c_cflag |= CS8;
		options.c_iflag |= (IXON | IXOFF | IXANY);
		options.c_cflag &= ~CRTSCTS;
		options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

		//	Set the new options for the port ...
		tcsetattr(fd, TCSANOW, &options);
a smyčka v které mi to při 10tce spadne. Z aducu se většinou vrací i ( je to zatim pouze test ) :
                              for(i = 0;i<24;i++){
					out_buffer[0] = 'z'; 
					out_buffer[1] = i;
					out_buffer[2] = 0;
					write(fd, out_buffer, 3);
					read(fd, in_buffer ,strlen(in_buffer));
					
					
					usleep(10);
					global[i][0] = in_buffer[1];
					global[i][1] = in_buffer[2];

					in_buffer[0] += '0';
					in_buffer[1] += '0';
					in_buffer[2] += '0';
					printf("%s \r\n",in_buffer);
					
					if(i == 9)	
						i = 10;
				}
Předem děkuji za jakoukoliv pomoc.

Lyso

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

14.3.2010 21:09 Lyso
Rozbalit Rozbalit vše Re: Pomoc se sériovým kanálem v c++
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ještě dodám že to
if(i == 9)	
i = 10;

jsem tam dodal kvůli toho aby se desitka přeskočila, potom to jde. Jenomže kdykoliv se na vstupu/vystupu desítka objeví, začne to dělat neplechu.
14.3.2010 21:26 comander
Rozbalit Rozbalit vše Re: Pomoc se sériovým kanálem v c++
strelim len tak od boku:

skusil by som port nastavit v konzoli podla clanku: http://www.abclinuxu.cz/clanky/hardware/seriova-komunikace-pod-linuxem-i

a zakomentovat nastavovanie portu v programe. kazdopadne dajte vediet aky je progres
15.3.2010 08:40 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: Pomoc se sériovým kanálem v c++
Odpovědět | | Sbalit | Link | Blokovat | Admin
options.c_iflag |= (IXON | IXOFF | IXANY);
Tohle mi na první pohled přijde podezřelé, tipoval bych, že Xon/Xoff řízení toku by mělo být spíš vypnuté.
Quando omni flunkus moritati
15.3.2010 18:28 Lyso
Rozbalit Rozbalit vše Re: Pomoc se sériovým kanálem v c++
Odpovědět | | Sbalit | Link | Blokovat | Admin
problém vyřešen, vypnul jsem ixoff, ixon a nastavil seriový kanál podle toho článku.

Díky :)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.