
WiRSa
nullvalue0/WiRSa
Wifi RS232 Serial Modem adapter with SD file transfer, SLIP & PPP features

Wifi RS232 Serial Modem adapter with SD file transfer, SLIP & PPP features
WiRSa is an open-source printed circuit board by nullvalue0, from the nullvalue0/WiRSa repository on GitHub, published under the MIT licence. It is a 2-layer board of 79.6 × 36.3 mm with 27 parts on 53 nets, routed with 276 tracks and 19 vias.
It is built around the MAX3243CDBRE4, TF-123-ARP9H17 and 2016WVS-02P, with the SK-3245S-L3-B among its other parts. Its parts include 9 resistors, 5 capacitors, 5 switches, 4 connectors and 3 ICs. It belongs with the radio and wireless and interfaces and adapters boards and the ESP32 boards of this library.
The WiRSa v3 is a WiFi-to-RS232 serial adapter designed for legacy computing systems. It allows vintage computers to connect to modern networks via WiFi, supporting telnet BBS connectivity, file transfers, and network gateway functionality.

If you prefer to save yourself some time, I have some units (fully assembled or kit) available for sale. I had quite a few PCB's made up and I am trying to keep these as cheap as possible. You can purchase on SmallRun.


.jpg)
AT$SSID=YourNetworkName
AT$PASS=YourPasswordAT&WUse the dial command with the host and port:
ATDT bbs.example.com:23Or configure speed dial entries:
AT&Z0=bbs.example.com:23
ATDS0| Command | Description |
|---|---|
AT | Test connection (returns OK) |
ATDT<host:port> | Dial/connect to TCP host |
ATDS<0-9> | Speed dial entry |
ATH | Hang up connection |
ATA | Answer incoming connection |
ATO | Return online from command mode |
+++ | Escape to command mode (during connection) |
ATE0/1 | Echo off/on |
ATV0/1 | Verbose results off/on |
ATI | Display network info |
AT&V | View current settings |
AT&W | Save settings to EEPROM |
ATZ | Load settings from EEPROM |
AT&F | Restore factory defaults |
AT&K<0/1/2> | Flow control (0=none, 1=hardware, 2=software) |
ATNET<0/1> | Telnet protocol handling off/on |
ATPET=<0/1> | PETSCII translation off/on |
AT$SSID= | Set WiFi SSID |
AT$PASS= | Set WiFi password |
AT$SP=<port> | Set listening port |
ATS0=<0/1> | Auto-answer off/on |
ATFC | Check for firmware updates |
ATFU | Perform firmware update |
AT? or ATHELP | Display help |
ATX | Exit MODEM Mode, return to WiRSa main menu |
The WiRSa supports binary file transfers directly from the SD card using industry-standard protocols:
To transfer files:

The WiRSa provides full TCP/IP networking capabilities for vintage computers through two standard protocols: SLIP (Serial Line Internet Protocol) and PPP (Point-to-Point Protocol). These modes turn the WiRSa into a dial-up internet gateway, allowing retro systems to browse the web, use email clients, FTP, and access other network services.
Both modes operate as NAT (Network Address Translation) gateways:
SLIP is a simpler, older protocol with less overhead. It works well with:
slattachDefault Configuration:
PPP is more robust with built-in negotiation, authentication support, and error detection. It's the standard for:
pppdDefault Configuration:
From the WiRSa Menu: (if your host OS is expecting an "always on" connection)
Using AT Dial Commands: (must set the device to Modem Mode first)
ATDT SLIP - Enter SLIP mode
ATDT 7547 - Enter SLIP mode (phone keypad for "SLIP")
ATDT PPP - Enter PPP mode
ATDT 777 - Enter PPP mode (phone keypad for "PPP")Using AT Commands: (must set the device to Modem Mode first)
AT$SLIP - Enter SLIP mode directly
AT$PPP - Enter PPP mode directlyPort forwarding allows incoming connections from the internet to reach services running on your vintage computer. This is useful for:
Configuring Port Forwards:
From the menu:
Using AT commands:
AT$SLIPFWD=TCP,80,80 - Forward TCP port 80 to client port 80
AT$SLIPFWD=UDP,53,53 - Forward UDP port 53 (DNS)
AT$SLIPFWDDEL=0 - Remove forward at index 0
AT$PPPFWD=TCP,23,23 - Forward TCP port 23 (telnet)
AT$PPPFWD=TCP,21,21 - Forward TCP port 21 (FTP)
AT$PPPFWDDEL=0 - Remove forward at index 0Note: Port forwards are shared between SLIP and PPP modes and persist across reboots.
Requirements:
Step 1: Configure WiRSa
AT$SSID=YourWiFiNetwork
AT$PASS=YourPassword
AT&WStep 2: Install Packet Driver
Create a batch file (e.g., SLIP.BAT):
@echo off
REM Load SLIP packet driver on COM1 at 115200 baud
ETHERSL 0x60 4 0x3F8 115200
REM Or for COM2: ETHERSL 0x60 3 0x2F8 115200Step 3: Configure TCP/IP Stack
For mTCP, create MTCP.CFG:
PACKETINT 0x60
IPADDR 192.168.7.2
NETMASK 255.255.255.0
GATEWAY 192.168.7.1
NAMESERVER 8.8.8.8Set environment variable:
SET MTCPCFG=C:\MTCP\MTCP.CFGStep 4: Connect
On the WiRSa, start SLIP Gateway by enabling from the buttons/screen menu, from the serial menu (exit terminal after Starting Gateway, it starts immediately), or by dialing
ATDT SLIPStep 5: Test Connection
PING 8.8.8.8
TELNET bbs.example.comStep 1: Create a New Connection
PPP (or 777)Step 2: Configure the Connection
Step 3: Modem Settings
Step 4: Connect
Step 5: Verify Connection
ping 8.8.8.8Requirements:
Step 1: Install TCP/IP-32
Step 2: Configure RAS (Remote Access Service)
Step 3: Connect
Linux has built-in SLIP support via the slattach utility. This guide covers configuring the serial port, enabling SLIP, and testing connectivity.
Requirements:
slattach utility (usually included in net-tools or slip package)Step 1: Identify Your Serial Port
First, identify the serial device. Physical serial ports are typically:
# First serial port (COM1 equivalent)
/dev/ttyS0
# Second serial port (COM2 equivalent)
/dev/ttyS1
# List available serial ports
ls -la /dev/ttyS*
# Check which serial ports are available
dmesg | grep -i ttySStep 2: Configure the Serial Port
Before starting SLIP, configure the serial port to match your WiRSa settings. Use stty to set the baud rate and other parameters:
# Set baud rate to 115200, 8N1, no flow control
sudo stty -F /dev/ttyS0 115200 cs8 -cstopb -parenb raw -echo
# For hardware flow control (if WiRSa has AT&K1 enabled), add crtscts:
sudo stty -F /dev/ttyS0 115200 cs8 -cstopb -parenb raw -echo crtscts
# Verify settings
stty -F /dev/ttyS0 -aKey stty options:
| Option | Description |
|---|---|
115200 | Baud rate (match WiRSa setting) |
cs8 | 8 data bits |
-cstopb | 1 stop bit (use cstopb for 2) |
-parenb | No parity |
raw | Raw mode (no input/output processing) |
-echo | Disable local echo |
crtscts | Enable hardware flow control |
Step 3: Test Serial Communication
Before enabling SLIP, verify you can communicate with the WiRSa:
# Open a simple terminal session
# Press Ctrl+C to exit when done
sudo cat /dev/ttyS0 &
echo "AT" | sudo tee /dev/ttyS0
# You should see "OK" response from WiRSa
# Kill the background cat process
kill %1
# Alternative: use screen or minicom
screen /dev/ttyS0 115200
# (Press Ctrl+A then K to exit screen)Step 4: Start SLIP Gateway on WiRSa
From your terminal session with WiRSa, enter SLIP mode:
AT$SLIPOr dial into SLIP mode:
ATDT SLIPYou should see "CONNECT SLIP" response. Now exit your terminal program (the serial port must be free for slattach).
Step 5: Enable SLIP on Linux
Attach the SLIP interface using slattach:
# Start slattach in the background
# -p slip = SLIP protocol
# -s 115200 = baud rate
sudo slattach -p slip -s 115200 /dev/ttyS0 &
# Note the PID for later cleanup
SLATTACH_PID=$!Step 6: Configure the Network Interface
Once slattach is running, a sl0 interface will be created. Configure it:
# Bring up the interface with the client IP
sudo ifconfig sl0 192.168.7.2 pointopoint 192.168.7.1 up
# Or using ip command (modern systems)
sudo ip addr add 192.168.7.2 peer 192.168.7.1 dev sl0
sudo ip link set sl0 up
# Add default route through the SLIP gateway (optional - routes all traffic through WiRSa)
sudo ip route add default via 192.168.7.1 dev sl0
# Or add only specific routes
sudo ip route add 8.8.8.8 via 192.168.7.1 dev sl0Step 7: Configure DNS
Add the DNS server to your resolver configuration:
# Temporary - add to /etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee -a /etc/resolv.conf
# For systems using systemd-resolved
sudo resolvectl dns sl0 8.8.8.8Step 8: Test the Connection
Verify connectivity through the SLIP link:
# Ping the WiRSa gateway
ping -c 3 192.168.7.1
# Ping an external IP (Google DNS)
ping -c 3 8.8.8.8
# Test DNS resolution
ping -c 3 google.com
# Check routing
ip route showExpected output for successful ping:
PING 192.168.7.1 (192.168.7.1) 56(84) bytes of data.
64 bytes from 192.168.7.1: icmp_seq=1 ttl=64 time=5.23 ms
64 bytes from 192.168.7.1: icmp_seq=2 ttl=64 time=4.89 ms
64 bytes from 192.168.7.1: icmp_seq=3 ttl=64 time=5.01 msStep 9: Cleanup (When Done)
To disconnect and clean up:
# Bring down the interface
sudo ip link set sl0 down
# Kill slattach
sudo kill $SLATTACH_PID
# Or find and kill by name
sudo killall slattachComplete Setup Script
Here's a complete script to automate the Linux SLIP setup:
#!/bin/bash
# slip-connect.sh - Connect to WiRSa via SLIP
DEVICE="/dev/ttyS0"
BAUD="115200"
LOCAL_IP="192.168.7.2"
GATEWAY_IP="192.168.7.1"
DNS="8.8.8.8"
# Configure serial port
sudo stty -F $DEVICE $BAUD cs8 -cstopb -parenb raw -echo
# Start slattach
sudo slattach -p slip -s $BAUD $DEVICE &
sleep 2
# Configure interface
sudo ip addr add $LOCAL_IP peer $GATEWAY_IP dev sl0
sudo ip link set sl0 up
# Add route for external traffic
sudo ip route add default via $GATEWAY_IP dev sl0
# Configure DNSTroubleshooting
| Issue | Solution |
|---|---|
| "Device or resource busy" | Another program is using the serial port. Close any terminal emulators. |
| No sl0 interface appears | Check if slattach is running: ps aux | grep slattach. Verify WiRSa is in SLIP mode. |
| Ping to gateway fails | Verify serial settings match WiRSa. Check cable connections. |
| External pings fail | Ensure WiRSa has WiFi connectivity. Check AT$SLIPSTAT for packet statistics. |
| Permission denied | Use sudo or add your user to the dialout group: sudo usermod -aG dialout $USER |
| Serial port not found | Ensure the serial port is enabled in BIOS/UEFI. Check setserial -g /dev/ttyS* for port status. |
SLIP Configuration:
| Command | Description |
|---|---|
AT$SLIP | Enter SLIP gateway mode |
AT$SLIPIP=x.x.x.x | Set gateway IP address |
AT$SLIPCLIENT=x.x.x.x | Set client IP address |
AT$SLIPDNS=x.x.x.x | Set DNS server |
AT$SLIPSHOW | Show current SLIP configuration |
AT$SLIPSTAT | Show SLIP statistics |
AT$SLIPFWD=proto,ext,int | Add port forward |
AT$SLIPFWDDEL=index | Remove port forward |
PPP Configuration:
| Command | Description |
|---|---|
AT$PPP | Enter PPP gateway mode |
AT$PPPGW=x.x.x.x | Set gateway IP address |
AT$PPPPOOL=x.x.x.x | Set client pool start IP |
AT$PPPDNS=x.x.x.x | Set primary DNS server |
AT$PPPDNS2=x.x.x.x | Set secondary DNS server |
AT$PPPSHOW | Show current PPP configuration |
AT$PPPSTAT | Show PPP statistics |
AT$PPPFWD=proto,ext,int | Add port forward |
AT$PPPFWDDEL=index | Remove port forward |
AT$PPPFWDLIST | List all port forwards |
+++ escape sequence (USB serial only in SLIP mode)The WiRSa includes a built-in Telnet server that allows remote access to devices connected via the serial port. This is useful for:
Set the listening port:
AT$SP=23 - Set server port to 23 (default telnet port)
AT$SP=2323 - Use alternate port 2323
AT$SP? - Query current portConfigure auto-answer:
ATS0=1 - Enable auto-answer (automatically connect incoming calls)
ATS0=0 - Disable auto-answer (ring and wait for manual answer)
ATS0? - Query current settingTelnet protocol handling:
ATNET1 - Enable telnet IAC sequence handling (recommended for telnet clients)
ATNET0 - Disable telnet handling (raw TCP mode)
ATNET? - Query current settingFrom any computer on the same network:
telnet <wirsa-ip-address> 23Or with a custom port:
telnet <wirsa-ip-address> 2323The WiRSa supports two types of incoming connections:
Console Connection (First Connection):
ATDT <host:port> to dial out to BBSesCall Connection (With Auto-Answer):
ATS0=1 is set, subsequent connections bridge directly to serial+++ to escape back to command modeATH to hang upScenario: You have a vintage Unix system with a serial console, and you want to access it remotely via telnet.
AT$SB=9600 - Set baud rate (match your system)
ATS0=1 - Enable auto-answer
ATNET1 - Enable telnet handling
AT&W - Save settingsScenario: Run a BBS on a vintage computer and accept incoming telnet connections.
AT$SP=23 - Listen on port 23
ATS0=1 - Auto-answer incoming connections
ATNET1 - Handle telnet protocol
AT&W - Save settingsWhen auto-answer is disabled (ATS0=0), incoming connections trigger a "RING" message:
RING
RING
RINGTo answer manually, type:
ATA - Answer the incoming callThis is useful when you want to screen incoming connections or when the connected device needs preparation before accepting a connection.
The Utilities menu provides diagnostic tools for troubleshooting:
| Function | GPIO | Description |
|---|---|---|
| RXD2 | 16 | UART2 RX (from computer) |
| TXD2 | 17 | UART2 TX (to computer) |
| DCD | 33 | Data Carrier Detect (output) |
| RTS | 15 | Request to Send (output) |
| CTS | 27 | Clear to Send (input) |
| DTR | 4 | Data Terminal Ready |
| DSR | 26 | Data Set Ready |
| RI | 25 | Ring Indicator |
| SD CS | 5 | SD Card Chip Select |
| SD MOSI | 23 | SD Card MOSI |
| SD MISO | 19 | SD Card MISO |
| SD SCK | 18 | SD Card Clock |
| Button | GPIO | Function |
|---|---|---|
| SW1 | 36 | DOWN |
| SW2 | 39 | BACK |
| SW3 | 34 | ENTER |
| SW4 | 35 | UP |
This is a PlatformIO project. See README-PLATFORMIO.md for detailed build instructions.
Quick start:
# Build firmware
platformio run
# Upload to ESP32
platformio run --target upload
# Monitor serial output
platformio device monitorThe WiRSa originated as a film prop for Apple TV's "The Shining Girls," where it simulated realistic computer interaction by playing back pre-recorded text files while actors typed on vintage terminals.

MIT License - See source code header for full license text.
Copyright (C) 2026 Aron Hoekstra
| Qty | Value | Footprint | References |
|---|---|---|---|
| 9 | 10k | Resistor_SMD:R_0603_1608Metric | R1, R2, R3, R4, R5, R6, R7, R8, R9 |
| 5 | 0.1uF | Capacitor_SMD:C_0603_1608Metric | C1, C2, C3, C4, C5 |
| 4 | SW_Push | Button_Switch_THT:SW_Tactile_SPST_Angled_PTS645Vx58-2LFS | SW1, SW2, SW3, SW4 |
| 1 | 2016WVS-02P | easyeda2kicad:CONN-SMD_P2.00_X2016WVS-02-9TSW | J4 |
| 1 | Conn_01x02_Socket | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J3 |
| 1 | DE9 Female | Connector_Dsub:DSUB-9_Female_Horizontal_P2.77x2.84mm_EdgePinOffset4.94mm_Housed_MountingHolesOffset7.48mm | J1 |
| 1 | ESP32-WROOM-32D DEV BOARD | esp32:ESP32-C3-DevKitC-02 | U2 |
| 1 | LOGO | wirsa:retrodisks | G*** |
| 1 | MAX3243CDBR | easyeda2kicad:SSOP-28_L10.2-W5.3-P0.65-LS7.8-BL | IC1 |
| 1 | SK-3245S-L3-B | easyeda2kicad:SW-SMD_SK-3245S-L3-B | SW5 |
| 1 | TF-123-ARP9H17 | easyeda2kicad:TF-SMD_TF-123-ARP9H15 | U1 |
| 1 | spare IO | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J2 |
It measures 79.6 × 36.3 mm and has 2 copper layers, 1.6 mm thick.
27 parts, built around the MAX3243CDBRE4, TF-123-ARP9H17, 2016WVS-02P and SK-3245S-L3-B. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the nullvalue0/WiRSa repository on GitHub, at the commit this page was made from: the board is PCB/WiRSa.kicad_pcb and its schematic Older Versions/V2/PCB/WiRSa.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

nullvalue0/WiRSa
Wifi RS232 Serial Modem adapter with SD file transfer, SLIP & PPP features

SolderedElectronics/Breadboard-power-supply-board-hardware-design
Hardware design, BOM, gerbers and 3D files for Breadboard-power-supply-board designed by Soldered Electronics.

LEDs-by-glowingkitty/GlowTower
A beautiful looking LED lamp for lighting up your home or setting the right mood at house parties - with animations that can react to music.

cr1tbit/pilkbrain
The schematic is still a bit messy, just for the reference for now.



