Well, I am off and running on getting my version of the code up to speed:
https://github.com/go4retro/tcpser
Man, some of this code is rough.? I have learned a lot about writing C
code in the last decade+.
Anyway, while I work on adding the appropriate functionality into the
codebase, I find myself ruminating on why there were so many parity
options in serial communications.
I understand the need for parity per se, given link quality and such.?
But, why the need for Odd, Even, Mark, Space.? Is there some reason why
different parity options work better in certain situations?
Also, for those wanting to help with some code:
int detect_parity(modem_config *cfg)
{
? int parity, eobits;
? int charA, charT, charCR;
? charA = cfg->pchars[0];
? charT = cfg->pchars[1];
? charCR = cfg->pchars[2];
? parity = (charA & 0x80) >> 7;
? parity |= (charT & 0x80) >> 6;
? parity |= (charCR & 0x80) >> 5;
? eobits = gen_parity(charA & 0x7f);
? eobits |= gen_parity(charT & 0x7f) << 1;
? eobits |= gen_parity(charCR & 0x7f) << 2;
? if (parity == eobits)
??? return 2;
? if (parity && (parity ^ eobits) == (parity | eobits))
??? return 1;
? return parity & 0x3;
}
#define gen_parity(v) (((((v) * 0x0101010101010101ULL) &
0x8040201008040201ULL) % 0x1FF) & 1)
Fozztexx (Chris Osborn) authored this little slice of code, and it uses
the AT<cr> to determine parity of the form:
space == 0
odd == 1
even == 2
mark == 3
I'm trying to sort the code out in my head, which will happen, but takes time. The
issue I see with it is the use of the CR as the third char to check.
Hayes S registers always allows the redefinition of the CR character, via S3. As such,
there's no guarantee line termination = CR, (yes, it's valid for the first AT
command, but not after, so if the user does a 8N1 ATS3=15<cr> and then switches to
7E1, the emulator will not handle well. I agree the likelihood is almost nil someone does
this, but tcpser is supposed to be very pedantic on such matters.
Thus, anyone have a way to discern parity using only the 'A' and 'T' ? I
guess I might be able to still use the terminator, since I know what it is ahead of time,
but not sure if the above code works on the principle that the 3 ASCII values have unique
traits that would not hold true for other values.
Jim