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