Our full technical support staff does not monitor this forum. If you need assistance from a member of our staff, please submit your question from the Ask a Question page.


Log in or register to post/reply in the forum.

CR1000, SerialOut() does not wait for WaitString?


bdy Apr 4, 2018 08:26 AM

CR1000, SerialOut() does not wait for WaitString?

Dear all,

i am trying to set the internal clock of a Grimm EDM164 Dust Monitor using the COM1 Port of a CR1000 logger. By use of the terminal mode in the LoggerNet Connect Screen, it is possible to do this flawlessly. I also managed to download data from the instrument to the logger, so the basic serial communication works.

To set the instruments time, it is necessary to act upon this pseudocode:

Send "T" 'Command to set time
Wait up to 0.5 sec until "T<CRLF>Year 18 :" is received
Send "1" 'send the most significant digit of the year
Wait for Echo "1"
Send "8" 'send the least significant digit of the year
etc.

I wrote a small program to test this functionality, and checked communication with DSO and RS232 monitoring software:

 

Const GrimmPort = Com1
SetStatus ("USRDriveSize",153600) 'USR: drive in SRAM for Grimm files

Public SetTimeFlag As Boolean

'Define Subroutines
Sub SetGrimmTime 'set Grimm RTC to Logger time, must be called at second 0
  Public rTime(9) As Long         'array to store system time
  Alias rTime(1) = YY          'assign the alias YY to rTime(1)
  Alias rTime(2) = MO          'assign the alias MO to rTime(2)
  Alias rTime(3) = DM          'assign the alias DM to rTime(3)
  Alias rTime(4) = HO          'assign the alias HO to rTime(4)
  Alias rTime(5) = MM          'assign the alias MM to rTime(5)
  Alias rTime(6) = Sek         'assign the alias Sek to rTime(6)
  Alias rTime(7) = uSek        'assign the alias uSek to rTime(7)
  Alias rTime(8) = WDay        'assign the alias WDay to rTime(8)
  Alias rTime(9) = DayOfYear   'assign the alias DayOfYear to rTime(9)
  Public GrimmInput1 As String * 30     'read buffer for Grimm
  Public GrimmInput2 As String * 30     'read buffer for Grimm
  Public XX1 As String * 4, XX2 As String * 4 'Buffer for MSM and LSB of RTC values

  'SerialOut(GrimmPort,"S","S",1,20) 'send S to stop measurement, wait 0.2s for Echo
  SerialFlush(GrimmPort)
  RealTime (rTime)
  YY -= 2000
  Sprintf(XX1,"%1s",Left(YY,1))
  Sprintf(XX2,"%1s",Right(YY,1))
  SerialOut(GrimmPort,"T",":",1,50) 'continues after first received character
  SerialOut(GrimmPort,"",":",1,50) 'wait up to 500ms for ":"
  'Delay(1,500,msec)
  SerialOut(GrimmPort,XX1,"",1,50) 'send MSB of Year, wait 0.5s for echo
  SerialOut(GrimmPort,XX2&Chr(13),"",1,50) 'send LSB of Year, wait 0.5s for echo

EndSub

'Main Program
BeginProg
  SerialOpen (GrimmPort,9600,0,0,1000)' for Grimm164, 9600 8N1, 420 bytes/dataset every 10 minutes

  SlowSequence
	Scan (10,Sec,0,0)'10 sec Loop for Grimm
		If SetTimeFlag Then
		     Call SetGrimmTime
		     SetTimeFlag = False
		End If
	NextScan
EndProg

 

The SerialOut() Instruction sends commands, but does not wait for the incoming string. The command

 

SerialOut(GrimmPort,"T",":",1,50) 'continues after first received character!

 

continues after receiving the first character of the string "T<CRLF>Year 18 :" whether i expected that execution is halted until timeout or receiption of ":".

Any ideas what's wrong?

Regards,

Bernhard


Sam Apr 5, 2018 03:50 AM

Using your program with the following line removed

SerialOut(GrimmPort,"",":",1,50) 'wait up to 500ms for ":"

On a CR1000 running OS 32.02, I saw the program wait for the ":" input. I also ran an exagerated version where the timeout was 50 seconds instead of 0.5 seconds. The logger would stop on the following line of code until I sent back a ":" character. I used RealTerm to send the "T<CRLF>YEAR 18 :" characters. Once the logger received the colon, it would immediately respond with "18<CR>"

Log in or register to post/reply in the forum.