commit b50d70dfe64900956894e2ec1fdbde4b6eef7360 from: Sven M. Hallberg date: Tue Jan 03 20:36:23 2023 UTC properly set up serial output commit - 31f1d1ddfcd8ac9a301f5b39224ad7a8b9d273b5 commit + b50d70dfe64900956894e2ec1fdbde4b6eef7360 blob - aae5b8fea4c35b16cb515b2f173f5dccf2d938c1 blob + 2c111ca25392034bbe052e66ef09f0677dd6b326 --- mc5000.c +++ mc5000.c @@ -7,15 +7,16 @@ * See also: https://github.com/rickp/MC5000_DevKit */ +#include #include #include /* uint8_t */ #include /* exit */ #include /* strcmp, strdup */ #include /* isdigit */ #include /* getopt */ -#include /* tcgetattr, tcsetattr, cfsetspeed */ #include -#include +#include /* tcgetattr, tcsetattr, cfsetspeed */ +#include /* nanosleep */ #include enum argtype {ARG_NONE, ARG_R, ARG_RI, ARG_L, ARG_P}; @@ -184,10 +185,21 @@ main(int argc, char *argv[]) if (devf != NULL) { struct termios t; - /* set line speed */ + /* perform unbuffered output */ + if (setvbuf(devf, NULL, _IONBF, 0) != 0) + err(1, "setvbuf"); + + /* set up line discipline - cf. termios(4) */ if (tcgetattr(fileno(devf), &t) != 0) err(1, "tcgetattr"); - cfsetspeed(&t, B19200); + cfsetspeed(&t, B19200); /* 19200 Baud */ + t.c_iflag = 0; /* raw input */ + t.c_oflag = 0; /* raw output */ + t.c_cflag = CREAD|CS8; /* 8N1, no flow control */ + t.c_cflag |= CLOCAL; /* ignore "modem" status */ + t.c_lflag = 0; /* no echo, line canon. etc. */ + t.c_cc[VMIN] = 0; /* stop read() if... */ + t.c_cc[VTIME] = 10; /* ...no input after 1 s */ if (tcsetattr(fileno(devf), TCSAFLUSH, &t) != 0) err(1, "tcsetattr"); @@ -236,7 +248,6 @@ main(int argc, char *argv[]) checksum = -checksum >> 2; emit_byte(checksum); emit_byte(0x7E); /* end code */ - fflush(devf); /* read and validate response */ if (fread(resp, 1, 3, devf) < 3)