I'm trying to initiate short burst data transfer from either a CR10X or CR1000 to an Iridium A3LAXM modem. There seems to be plenty of advice in the manuals for initiating telecommunications with dial-up connections, but I can't find anything at all on setting up SBD.
I have tried using a simple solution with a serial out command (Ins 96) or serial output (Ins 15) but predictably this doesn't work.
I presume Ins 97 is the correct command, but how do I address the modem without initiating callback?
Leaving for the field in 2 days, any help at all would be appreciated!
Thanks.
I think you will not get very far with a CR10X in making this work as the protocol is not straightforward. If you want to try tackle this then this technical note for sending SMS text messages would be a good base, but you are on your own otherwise:
http://www.campbellsci.co.uk/index.cfm?id=1018
If you would like to send me your email details I may have another program I can email you as a starter for the CR1000. My email is:
andrew dot sandford at campbellsci dot co dot uk
I have not tried this on a CR10X but have played around a little with the CR1000.
The big thing with communication with the 9522 iridium modem was that you need to set the modem up for 3 wire communication. TO do this I had to attached to the computer in hyperterminal
Send it
AT&DK0 - set to ignore DTR from device
AT&K0 - set to NO flow control
AT&W0 - save current profile as default
AT&Y0 - save profile 0 as default
Then the first thing in my program that I had to do was always set the baud rate to what you are expecting, with the AT+IPR command
Also I found that I needed to send teh ATV1 command to keep it communicating in text.
Then the normal RS232 Serialin and serialout commands worked. I am assuming it would be the same with the Instr. 15 commands and a CR10.
Trying out the commands hooked to hyperterminal was a great help as you could see what the transmitter echoed and what it did not which affects your serial in commands.
Hi again all,
A quick progress report: thanks to your great advice I almost got everything working in time, using the CR1000. The hyperterminal hint in particular was fantastic.
I think I was missing some hardware to get the logger to talk to the modem (I was hoping that what I had in house would suffice. It didn't), but I got the logger to respond to the hyperterminal commands and the modem to put the right commands out to the hyperterminal, so I'm all set for next season.
Thanks again for your help.
I got it working well with the above AT commands and then used the AT+SBDWT and AT+SBDI to prepare and send the message.
Then built a null modem lead for between the CSIO port and modem.
Works like a charm.
Dear Sir,
I am trying to interface Iridium 9602B modem for SBD transfer.
I have to remotely transfer the min,max and average of parameters from remote station to my central station.
I can't find any examples of programming a serial modem (specially Iridium modem) and handle the responses from the modem. Please could you tell what i can do
Thank You
Sudat
Here is a program I used to test a message via SBD on a CR800.
'CR8
'Created by Grant Millar
'Environmental Monitoring Solutions Qld
'+61417300119
'grant@emsqld.com
'
'Program to send message via Short Burst Data (SBD) with Beam Communications RST600 Iridium satellite modem
'
'Program written - 21st July 2010
'
'Declare Public Variables
Public PTemp, batt_volt
Public TxString As String * 500
'Define Data Tables
DataTable (Test,1,-1)
DataInterval (0,1,Hr,10)
Minimum (1,batt_volt,FP2,0,False)
Sample (1,PTemp,FP2)
EndTable
'Define Subroutines
Sub IridiumTx
'Open Com2 at 19200 baud
SerialOpen(ComME,115200,3,0,400)
'Send AT command and wait for OK response
SerialOut(ComME,"AT"+CHR(13),"OK",10,10)
SerialClose(ComME)
EndSub
'Main Program
BeginProg
Scan (20,Sec,0,0)
PanelTemp (PTemp,250)
Battery (Batt_volt)
'Define string to be sent to modem buffer
TxString="Battery Voltage="+FormatFloat(Batt_Volt,"%2.2f")+" Volts."+" Panel temperature="+FormatFloat(PTemp,"%2.2f")+" Deg C"
If IfTime (0,1,min) Then
Call (IridiumTx)
EndIf
CallTable Test
NextScan
EndProg
Hope it helps
Cheers
Grant
I think there is at least one line missing in that program (the one that sends the command to transmit the string)?
* Last updated by: aps on 10/30/2012 @ 5:07 AM *
Goodness Andrew, you are correct.
Try this one
'Declare Public Variables
Const TxStringMaxLen = 420
Public PTemp, batt_volt
Public TxString As String * TxStringMaxLen + 1
'Define Data Tables
DataTable (Test,1,1000)
DataInterval (0,60,Sec,10)
Minimum (1,batt_volt,FP2,0,False)
Sample (1,PTemp,FP2)
EndTable
'Define Subroutines
Sub IridiumTx
SerialOpen(ComME,19200,3,0,400)
SerialOut(ComME,"AT"+CHR(13)+CHR(10),"OK",1,10)
SerialOut(ComME,"AT+SBDWT="+TxString+CHR(13),"",1,10)
SerialOut(ComME,"AT+SBDI"+CHR(13),"",1,10)
SerialClose(ComME)
EndSub
'Main Program
BeginProg
Scan (20,Sec,0,0)
PanelTemp (PTemp,250)
Battery (Batt_volt)
TxString="Battery Voltage="+FormatFloat(Batt_Volt,"%2.2f")+" Volts."+" Panel temperature="+FormatFloat(PTemp,"%2.2f")+" Deg C"
If IfTime (0,1,min) Then
Call (IridiumTx)
EndIf
CallTable Test
NextScan
EndProg
Awesome! This program works on the 9602LP also!
Hi Grant (and anyone... everyone!),
This is already a few years old now. Your test program worked great with an SBD modem I am using - thanks!
I'm currently trying to add 'retry' functionality using your script as a starter, however am having issues grabbing serial data to initiate retries.
I've tried a few things, but the one that made the most sense was to use SerialInRecord following the SBDI command:
Public SBDI_Output As String
'.....
SerialOut(ComRS232,"AT+SBDI"+CHR(13),"",1,10)
SerialInRecord(ComRS232,SBDI_Output,&H3A,0,&H4B,Num_Bytes_Ret,01)
**The HEX designate obvious flags within the SBDI echo.
In this case, SBDI_Output would be a string containing transmission characteristics (i.e. 0,1,2 values) that I could then parse and use to establish retries.
However - the SerialIn commands dont produce any data.
Curious if anyone can give advice either on implementing a protocol for SBD retries, or any ideas on why SerialIn commands are not working here.
I'm testing this on a CR300.
Thanks and good day!
Best,
Zach
This is part of a program I used before. I used the wait string parameter of the SerialOut to advance the receive buffer up to the point of the result code from the modem. This is missing the AT commands, which you already have figured out.
Sub SendSBD(Result(4) As String * 32,ComPort,Source(4) As String * 360) Dim SBD_TxResult As Long Dim i As Long Dim k As Long For i = 1 To 4 If Source(i) <> "" Then For k = 1 To num_retries 'enter number of retries here SerialFlush (ComPort) SerialOut(ComPort,Source(i),"OK",1,200) SerialFlush(ComPort) SerialOut(ComPort,IridiumTx,"+SBDI: ",1,5000) SerialIn (Result(i),ComPort,100,0,100) SplitStr (SBD_TxResult,Result(i),",",1,0) If SBD_TxResult <> 1 Then Delay(1,5,sec) Else ExitFor EndIf Next k Source(i) = "" EndIf Next i EndSub
Thank you -
Working through it a bit, a few questions:
> Source refers to respective AT commands - as many as I'd like to push along? Thus, I"d pre-define source text arrays prior to the sub routine? And submit the array integer to the sub routine....?
> Do you apply SerialOpen/Serial Close in the main program before/after calling the sub routine?
> What are your 4 result arrays? Result(4) also needs pre-definition to receive SBD output. I'm guessing these are message number, successful transission, etc.?
Still trying to understand as it seems to be a neat, but completely different approach!
thanks again!
z
Got it figured out - thank you!
z