Device OS 6.5.0 Release is available in the Web IDE, Particle CLI and Workbench for (Argon/Boron/B-SoM/B5-SoM/Tracker/Tracker-M/E-SoM-X/M-SoM/P2).
Released on July 17th, 2026
See documentation about Device OS versions, their current state, upgrades and downgrades here.
6.5.0
FEATURES
- Multi-byte
read()/peek()/write()APIs for hardware UARTs and USB Serial #2935 - Per-interface cloud keepalive environment variables (
PARTICLE_CLOUD_KEEP_ALIVE,PARTICLE_CELLULAR_CLOUD_KEEP_ALIVE,PARTICLE_WIFI_CLOUD_KEEP_ALIVE,PARTICLE_ETHERNET_CLOUD_KEEP_ALIVE) andParticle.getKeepAlive()#2916 - Power manager
PARTICLE_POWER_INPUT_CURRENTandPARTICLE_POWER_CHARGE_CURRENTenvironment variables #2928 #2929
ENHANCEMENTS
- Tethering and cellular (PPP) throughput and reliability improvements (adaptive LCP echo, dedicated PPP TX queue) #2932
- [network]
SO_LINGERsupport for faster TCP pcb/pbuf cleanup #2932 - [Gen 4] network: improved TCP performance (larger windows/buffers) #2932
- [M SoM] M635: Enable 2G fallback support #2933
BUGFIXES
- [Gen 4] Allow USB CDC (
Serial) buffers to be resized withacquireSerialBuffer()after first initialization #2932 - [Gen 4] usart: fix event handling in interrupt mode UARTs causing reads/writes through
waitEvent()(e.g. PPP tethering) to only progress on poll timeouts #2932 - [Gen 4] usart: fix RTS/CTS hardware flow control being silently disabled due to slow clock domain register access #2932
- [Gen 4] usart: fix FIFO overflow behavior under RTS flow control #2932
- [Gen 4] usart: fix DMA-mode USART (NCP or Serial2 on P2/Photon2)
available()/peek()not accounting for data still residing in the GDMA FIFO e316605 - [Gen 4] usart: fix received data loss when entering sleep with DMA-mode (
Serial2) UART e316605 - [Gen 4] usart: fix TX buffer handling in interrupt mode e316605
- [Gen 3] usart: fix interrupt/normal context race condition causing TX transmissions to never start #2932
- [Gen 3] usart: fix multi-byte
peek()not seeing all the data reported byavailable()e316605 - [network] tethering: fix TCP MSS clamping in NAT #2932
- [Gen 4] [Cellular] muxer: prevent USB starvation and busy looping under heavy cellular traffic #2932
- [network] lwip: fix
tcp_pcbdouble-free intcp_input_delayed_close()#2932 - [system] Apply cloud keepalive based on the active network interface when the cloud connection moves between interfaces (ACM) #2916
- [Gen 4] usb: fix control interface class driver consuming
dataIn/dataOutevents for unrelated endpoints #2922 - [Gen 4] usb: distinguish between the host halting reads from USB
Serialand a slow host #2932 - tethering: Fix blocking behavior on writes when tethering over USB #2932
- [hal] fix
os_thread_join()accessing a stale/freed task TCB #2932 - [hal] fix idle hook priority bump when there are threads pending cleanup, keeping terminated thread resources from being freed #2932
- [wiring] network: fix null pointer dereference for interfaces without a hardware address #2932
- [system] Force cloud connection checks on interface state changes only for interfaces that can carry the cloud connection #2932
- Improve I2C driver reliability:
Wire.end()in user application no longer breaks PMIC/FuelGauge access in system power manager #2913 - Fix race condition on entering
POWER_OFFsleep mode with AM18x5 (external RTC) #2927 - Fix default cloud keepalive values #2926
- [system] Do not run background network connection test if no networks are ready, avoiding LwIP errors when polling with no connected sockets #2930
- [Cellular] Workaround for EG916Q returning too large APDU responses #2934
INTERNAL
- [system] API for scheduling calls in the system thread #2921
- iperf3 (
libiperf) port and tethering throughput HIL test suites (UDP/TCP, bidirectional, USB and Serial1, device-direct cellular paths) #2932 #2920 - [hal] Coalesce serial stream implementations into a shared one #2932
- [GCC] Multi-byte serial read/write/peek support and poll()-based serial wait events, fix tinker builds #2935
- [third_party]
lwip:SO_LINGERfixes (abort on close with zero linger timeout, do not abort sockets in LISTEN state), per-pcb RX frame counter for adaptive LCP echo, mapERR_IFtoEIO,tcp_pcbdouble-free fix #2932 - [third_party]
freertos: exposeuxTaskGetNumberOfTasksWaitingTermination()#2932 - [third_party]
gsm0710muxer: addGSM0710_COOP_YIELD_MSandGSM0710_MAX_TIMEOUT_ITERATIONSto avoid busy looping and time-share CPU #2932 - [third_party]
coremark: fix builds on the GCC platform #2935 - [build] [Gen 3] Reclaim >3KB of flash on LTO-enabled platforms with
-flto-partition=one#2928 - [test] Flash a dummy OTA at the start of the test runner suite to reset device service
maxSameBinaryAttemptscounter, which was blocking OTA updates on repeated test runs #2931 - [test] Work around spurious USB control transfer stalls (kernel
xhci_hcdbug) during pre-sleep mailbox handshake with an explicit mailbox ACK mechanism, propagate mailbox result codes to tests #2923 - [test]
wiring/sleep20: make sure pending reset mailbox messages are received by the test runner before the device goes into sleep #2919 - [test]
wiring/serial_loopback2: always tri-state the loopback buffer in cleanup #2918 - [test]
wiring/serial_loopback/serial_loopback2: parameterize forSerial1/Serial2/Serial3use, cover multi-byte read/write/peek andavailable()consistency 538a25c
System Binaries (all devices)
https://github.com/particle-iot/device-os/releases/download/v6.5.0/particle_device-os@6.5.0.zip