Previous experience with embedded systems and serial-interfaces, only looking right now for... "will this work"....?
Looking at building a reader/striker, using an existing Casi Rusco badge. Looks like a compatible reader is the Casi Rusco 940, which can be switch-set to Wiegand 40bit (4001). I've seen some sample code out to 26bit, yet haven't come across any 40bit. Also, is it reasonably easy to interface a trigger lead to trip a striker...?
Thx!
"will this work"....?
There are RFID readers that work to different specs.
If only there was some way to search the internet in a way more definite than asking on forums!
Not much help, yet thanks. 
Simple searches finds there's tons of support for the MFRC522 via drivers by miguelbalboa, and RFID522-Door-Unlock by omersiar.
The issue is, the RC522 reader is at 13.56Mhz using the MIFARE standard, while I'm trying to use a Casi Rusco 940, which is a 125khz reader using the Weigand 40-bit format.
I've been digging for a while, and just can't find any reference to interfacing a 940 to an Anduino. There's some references to Weigand out to 26bits using non-CR readers, yet still digging.
This sketch will display the raw Wiegand bits along with the bit length and parity. If you can get consistent results from your badge reader it should be easy enough to get the card number from the Wiegand interface.
/**********
This sketch displays the raw bits received from a Wiegand device along with bit count and parity
Connect the D0 line to Pin 2 and the D1 line to Pin 3 on an Arduino UNO.
Connect the signal ground to GND on the Arduino
Note: If the bit count is not consistent you probably have a bad connection.
This is especially true if you are only receiving 0 bits or 1 bits.
************/
// Connect D0 to Pin 2 and D1 to Pin 3
const byte PinD0 = 2;
const byte PinD1 = 3;
const byte IntD0 = 0;
const byte IntD1 = 1;
volatile unsigned BitCount = 0;
volatile byte Bits[100];
volatile unsigned long LastBitTime;
volatile boolean Parity = 0;
void setup() {
Serial.begin(9600);
while (!Serial); // Wait for Leonardo/Micro USB to connect
pinMode(PinD0, INPUT); // Set D0 pin as input
pinMode(PinD1, INPUT); // Set D1 pin as input
attachInterrupt(IntD0, ReadD0, FALLING); // Hardware interrupt - high to low pulse
attachInterrupt(IntD1, ReadD1, FALLING); // Hardware interrupt - high to low pulse
// The two data lines idle HIGH
if (digitalRead(PinD0) == LOW) {
Serial.println(F("WARNING: D0 line (on Pin 2) is not in a HIGH state. Wiring error?"));
}
if (digitalRead(PinD1) == LOW) {
Serial.println(F("WARNING: D1 line (on Pin 3) is not in a HIGH state. Wiring error?"));
}
}
void loop() {
byte localBits[100];
// Grab volatile variables with interupts disabled
noInterrupts();
unsigned long interval = millis() - LastBitTime;
unsigned count = BitCount;
boolean parity = Parity;
interrupts();
// Process data when we have new bits, but not for a while.
if (count != 0 && interval > 100) {
// Grab a local copy of the bit pattern
noInterrupts();
for (unsigned i = 0; i < count; i++) {
localBits[i] = Bits[i];
}
// Reset for next message
BitCount = 0;
Parity = 0;
interrupts();
// Display the received bits in binary, along with bit count and parity
Serial.print(count);
Serial.print(" bits: ");
for (unsigned i = 0; i < count; i++) {
Serial.print(localBits[i]);
}
Serial.println(parity ? " parity=1 (Odd)" : " parity=0 (Even)");
}
}
void ReadD0() {
if (BitCount < 100) {
LastBitTime = millis();
Bits[BitCount++] = 0;
}
}
void ReadD1() {
if (BitCount < 100) {
LastBitTime = millis();
Bits[BitCount++] = 1;
Parity = !Parity;
}
}