#include "p_serial_bus.h" #include "p_util.h" #include #include #include #include #include /* Include definition for RS485 ioctls: TIOCGRS485 and TIOCSRS485 */ #include ps_bus::ps_bus(const char* dev) { /* Open your specific device (e.g., /dev/mydevice): */ printf("%s\n", dev); dev_fd = open(dev, O_RDWR | O_NOCTTY); if (dev_fd < 0) { /* Error handling. See errno. */ fprintf(stderr, "Creation of the bus failed... error: %s", strerror(errno)); exit(1); } memset(&rs485conf, 0, sizeof(rs485conf)); /* Enable RS485 mode: */ rs485conf.flags |= SER_RS485_ENABLED; /* Set logical level for RTS pin equal to 1 when sending: */ rs485conf.flags |= SER_RS485_RTS_ON_SEND; /* or, set logical level for RTS pin equal to 0 when sending: */ // rs485conf.flags &= ~(SER_RS485_RTS_ON_SEND); /* Set logical level for RTS pin equal to 1 after sending: */ // rs485conf.flags |= SER_RS485_RTS_AFTER_SEND; /* or, set logical level for RTS pin equal to 0 after sending: */ rs485conf.flags &= (uint32_t) ~(SER_RS485_RTS_AFTER_SEND); // /* Set rts delay before send, if needed: */ // rs485conf.delay_rts_before_send = ...; // /* Set rts delay after send, if needed: */ // rs485conf.delay_rts_after_send = 10; /* Set this flag if you want to receive data even while sending data */ // rs485conf.flags |= SER_RS485_RX_DURING_TX; memset(&toptions, 0, sizeof(toptions)); tcgetattr(dev_fd, &toptions); toptions.c_cflag &= (uint32_t) ~(CSIZE | PARENB); // enable receiver toptions.c_cflag |= CREAD; // 8 data bit toptions.c_cflag |= CS8; // Ignore framing errors and parity errors toptions.c_lflag &= (uint32_t) ~(ICANON); toptions.c_lflag &= (uint32_t) ~(ECHO); toptions.c_lflag &= (uint32_t) ~(ECHOE); // disable signal chars toptions.c_lflag &= (uint32_t) ~(ISIG); // set baud rate cfsetspeed(&toptions, B115200); // flush cache tcflush(dev_fd, TCIFLUSH); // apply tcsetattr(dev_fd, TCSANOW, &toptions); if (ioctl(dev_fd, TIOCSRS485, &rs485conf) < 0) { printf("ERROR\n"); /* Error handling. See errno. */ } } ps_bus::~ps_bus() { /* Close the device when finished: */ if (close(dev_fd) < 0) { /* Error handling. See errno. */ } } bool ps_bus::send_pkt(const ps_packet* const pkt) { bool ret = true; pkt->show_packet(); if (write(dev_fd, pkt->data, pkt->msg_len) != (int)pkt->msg_len) { ret = false; } tcflush(dev_fd, TCIFLUSH); usleep(1000); return ret; } bool ps_bus::recv_pkt(ps_packet* const pkt) { UNUSED(pkt); bool ret = true; return ret; }