#include #include #include #include #include #include /* UNIX standard function definitions */ #include /* Error number definitions */ #include /* POSIX terminal control definitions */ /* Serial port */ #define BDR_9600 (0) #define BDR_38400 (1) #define SERIAL_PORT "/dev/cu.usbserial-FTE3AXGN" int serialfd = -1; int serial_have_data = 0; unsigned char serial_data = 0; int serial_speed = BDR_38400; void open_serial() { if (serialfd < 0) { serialfd = open(SERIAL_PORT, O_RDWR | O_NOCTTY | O_NDELAY); //set_baudrate(serial_speed); serial_have_data = 0; } } void set_baudrate(int speed) { struct termios options; if (serialfd < 0) return; tcgetattr(serialfd, &options); options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; if (speed == BDR_9600) { cfsetispeed(&options, B9600); } else { cfsetospeed(&options, B38400); } // options.c_cflag &= ~CNEW_RTSCTS; options.c_cflag |= (CLOCAL | CREAD); options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); tcsetattr(serialfd, TCSANOW, &options); /* Make sure read is not blocking */ fcntl(serialfd, F_SETFL, FNDELAY); } void close_serial() { close(serialfd); serialfd = -1; } void check_serial_data() { unsigned char buf[10]; int f; if (serialfd < 0) return; if (serial_have_data == 0) { f = read(serialfd, buf, 1); if (f > 0) { //printf("Ho [%d]!\n", f);fflush(stdout); serial_have_data = 0x01; serial_data = buf[0]; } } } unsigned char read_serial() { unsigned char buf[10]; int f; if (serialfd < 0) return 0xFF; if (serial_have_data > 0) { serial_have_data = 0; return serial_data; } f = read(serialfd, buf, 1); if (f == 1) return buf[0]; return 0x42; } void write_serial(unsigned char value) { if (serialfd < 0) return; write(serialfd, &value, 1); } void fuzz(unsigned char *buf) { if ((rand() % 200) < 5) { switch(rand() % 8) { case 0: write_serial(0xF6); *buf = rand()%0x10; printf("x"); break; case 1: write_serial(0xFB); *buf = rand()%0x10; printf("a"); break; //case 2: write_serial(0xF5); *buf = rand()%0xFF; printf("b"); break; //case 3: *buf ^= 0x08; printf("c"); break; //case 4: *buf ^= 0x10; printf("d"); break; //case 5: *buf ^= 0x20; printf("e"); break; //case 6: *buf ^= 0x40; printf("f"); break; //case 7: *buf ^= 0x80; printf("g"); break; } fflush(stdout); } /* else printf(" ");*/ } int main(int argc, char *argv[]) { int i = 0; unsigned char buf; open_serial(); if (argc > 1) set_baudrate(atoi(argv[1])); else set_baudrate(0); printf("Run!\n"); while(1) { while(serial_have_data == 0) check_serial_data(); buf = read_serial(); // if (buf != 0xFC) //{ printf("%02X ", buf); fflush(stdout); i++; //} //fuzz(&buf); if (i >= 32) { i = 0; printf("\n"); } write_serial(buf); } }