Over the last week I have been working on GHI Electronics TinyCLR-0SV2RC1 and nanoFramework and C# libraries for the LoRa-E5 module from Seeedstudio.
The initial test rigs were based on an Arduino Uno R3 format socket for a Grove Base Shield V2.0 which I then connected to my LoRa-E5 Development Kit with a Grove – Universal 4 Pin 20cm Unbuckled Cable(TX/RX reversed)
While testing I noticed that every so often that when I restarted the test application application, rebooted or power cycled the nanoFramework or Fezduino device the Seeed LoRa-E5 wouldn’t connect.
After some trial and error manually entering commands in Terraterm I found that if the LoRa-E5 had been put to sleep (AT+LOWPOWER) the response to the first command (usually setting the region with AT+DR=AS923) would be unexpected. The problem was more obvious when I used devices that were configured for “soak testing” because the gap between messages was much longer (5min vs. 30 seconds)
AT+VER
+VER: 4.0.11
AT+UART=TIMEOUT, 30000
+UART: TIMEOUT, 30000
AT+LOWPOWER
+LOWPOWER: SLEEP
AT+DR=AS923
AT+LOWPOWER: WAKEUP
AT+DR=AS923
+DR: AS923
AT+JOIN FORCE
+JOIN: Start
+JOIN: FORCE
+JOIN: Network joined
+JOIN: NetID 000013 DevAddr 26:08:46:70
+JOIN: Done
AT+CMSGHEX="00 01 02 03 04"
+CMSGHEX: Start
+CMSGHEX: Wait ACK
+CMSGHEX: FPENDING
+CMSGHEX: ACK Received
+CMSGHEX: RXWIN1, RSSI -29, SNR 9.0
+CMSGHEX: Done
After trying several different approaches which weren’t very robust I settled on sending a wakeup command (AT+LOWPOWER: WAKEUP with an expected response of +LOWPOWER: WAKEUP) and ignoring the result.
public Result Initialise(string serialPortId, int baudRate, UartParity serialParity, int dataBits, UartStopBitCount stopBitCount)
{
if ((serialPortId == null) || (serialPortId == ""))
{
throw new ArgumentException("Invalid SerialPortId", "serialPortId");
}
if ((baudRate < BaudRateMinimum) || (baudRate > BaudRateMaximum))
{
throw new ArgumentException("Invalid BaudRate", "baudRate");
}
serialDevice = UartController.FromName(serialPortId);
// set parameters
serialDevice.SetActiveSettings(new UartSetting()
{
BaudRate = baudRate,
Parity = serialParity,
StopBits = stopBitCount,
Handshaking = UartHandshake.None,
DataBits = dataBits
});
serialDevice.Enable();
atCommandExpectedResponse = string.Empty;
serialDevice.DataReceived += SerialDevice_DataReceived;
// Ignoring the return from this is intentional
this.SendCommand("+LOWPOWER: WAKEUP", "AT+LOWPOWER: WAKEUP", SendTimeoutMinimum);
return Result.Success;
}
This modification has been applied to both libraries. I will also check that the RAK811 nanoFramework and TinyCLR libraries don’t have the same issue.