Strona 1 z 1

Zamienia znaki w transmisji szeregowej 13 na 10

: 05 kwietnia 2016, 09:40
autor: arturromarr
Witam,
Mam podłączomy mikrokontroler pod Linuxa który komunikuje się portem szeregowym.
Jest problem ze znakiem 13 (dziesiętnie) który mój program odbiera jako 10 (dziesiętnie).
Nadawany jest prawidłowo bo sprawdzałem innymi programami i odbierają prawidłowo.
Inne znaki są prawidłowe, jedyne co mi przychodzi to że jest jakieś automatyczne CRLF, ale nic takiego nie ustawiam.

Kod: Zaznacz cały

int ustaw_port(int fd)
{
int Bspeed=B9600;
	struct termios conftty;							//zmienna pomocnicza do nadania ustawien
	memset (&conftty, 0, sizeof conftty);
		if (tcgetattr (fd, &conftty))				//pobranie do zmiennej aktualnych uatawien portu szeregowego
				{printf("\n Błąd pobrania ustawień portu szeregowego\n");return -1;};

        cfsetospeed (&conftty,Bspeed);				//ustawienie prędkości zapisu
        cfsetispeed (&conftty,Bspeed);				//ustawienie prędkości odczytu

        conftty.c_cflag = (conftty.c_cflag & ~CSIZE) | CS8;     // czyszczenie Maski i ustawienie 8-bitów danych
		conftty.c_cflag |= (CLOCAL | CREAD);					//ignorowanie kontroli modemu i włączenie odczytu
		if(parity){conftty.c_cflag |= (PARENB | PARODD);		//bit nieparzystości
					if(parity==1)conftty.c_cflag &= ~ PARODD;}	//bit parzystości
			else{conftty.c_cflag &= ~(PARENB | PARODD);};		//bez parzystości

		if(stop_bits==1){conftty.c_cflag &= ~CSTOPB;}			// 1 bit stopu
			else{conftty.c_cflag |= CSTOPB;};					// 2 bit stopu
        conftty.c_cflag &= ~CRTSCTS;							//wyłącznie sprzętowej kontroli przepływu
        
		conftty.c_lflag = 0;									// bez znaków sygnałowych, bez echa
		
		conftty.c_oflag = 0;									//bez remapowania, bez opóźnień
		
        conftty.c_iflag &= ~IGNBRK;         					// wyłączenie przerywających procesów
        conftty.c_iflag &= ~(IXON | IXOFF | IXANY); 			// wyłączenie programowej kontroli przepływu xon/xoff ctrl
        conftty.c_iflag &= ~(ICANON | ECHO | ECHOE | ISIG); 	// wyłączenie domyślnego trybu Cannonical oraz echa

        conftty.c_cc[VMIN]  = 0 ? 1 : 0;						// bez blokowania ilości czytanych znaków
        conftty.c_cc[VTIME] = 1;            					// 0.1 sekund oczekiwania na odczyt

        if (tcsetattr (fd, TCSANOW, &conftty))		//zapisanie aktualnych uatawień portu szeregowego ze zmiennej pomocniczej
				{printf("\n Błąd zapisania ustawień portu szeregowego\n");return -1;};
	return 0;
}

int ON_port(char *portname)
{
int fd = open (portname, O_RDWR | O_NOCTTY | O_SYNC);
return fd;
}

void OFF_port(int *fd)
{
close(*fd);
}
odczytuję poleceniem:

Kod: Zaznacz cały

read(fd, mbusramkaWe, sizeof mbusramkaWe);
Trochę mnie to irytuje bo program poza tym fajnie działa, tylko zamienia te dwa znaki. Jak odczytuję np czas z mikrokontrolera to zamiast 13:13:13 odczyta 10:10:10
Proszę o jakąś pomoc osoby które miały styczność z portem szeregowym pod Linuxem

Re: Zamienia znaki w transmisji szeregowej 13 na 10

: 05 kwietnia 2016, 11:38
autor: dedito
Nie widać w twoich źródłach funkcji wyświetlającej zawartość mbusramkaWe (lub czegokolwiek innego na podstawie którego stwierdzasz ową zamianę).

Re: Zamienia znaki w transmisji szeregowej 13 na 10

: 05 kwietnia 2016, 13:28
autor: arturromarr
Funkcja wyświetlająca to kilka ekranów kodu bo interpretuje ramkę ModBus i wyświetla w okienkach.
Jednak problem pojawia się nisko już w odczytanych zakach przez funkcję read.
Kiedy wyrzucam bezpośrednio znak na terminal (dodatkowo dwa sąsiednie młodsze bajty ramki) to już jest zamieniony.

Kod: Zaznacz cały

n_odczyt = read(fd, mbusramkaWe, sizeof mbusramkaWe);
g_print ("odczytano %d %d %d\n",mbusramkaWe[3+(2<<1)],mbusramkaWe[4+(2<<1)],mbusramkaWe[5+(2<<1)]);
Inne znaki są prawidłowo odczytywane, tylko ta 13 jest podmieniana.