Zamienia znaki w transmisji szeregowej 13 na 10

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
arturromarr
Beginner
Posty: 190
Rejestracja: 14 sierpnia 2015, 01:21

Zamienia znaki w transmisji szeregowej 13 na 10

Post 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
Awatar użytkownika
dedito
Moderator
Posty: 3560
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Zamienia znaki w transmisji szeregowej 13 na 10

Post 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ę).
Awatar użytkownika
arturromarr
Beginner
Posty: 190
Rejestracja: 14 sierpnia 2015, 01:21

Re: Zamienia znaki w transmisji szeregowej 13 na 10

Post 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.
ODPOWIEDZ