Zamienia znaki w transmisji szeregowej 13 na 10
: 05 kwietnia 2016, 09:40
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.
odczytuję poleceniem:
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
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);
}
Kod: Zaznacz cały
read(fd, mbusramkaWe, sizeof mbusramkaWe);
Proszę o jakąś pomoc osoby które miały styczność z portem szeregowym pod Linuxem