RS232 query device

Just starting out? Need help? Post your questions and find answers here.
johanholstein
New User
New User
Posts: 1
Joined: Wed Aug 06, 2008 2:06 pm
Location: The Netherlands

RS232 query device

Post by johanholstein »

Hello all,

I'm a newbie so this is my question, my device is a vacuum meter and to get data out i must send a string ?GA1 the device responds with science notation say 1.00E3 or 5.00E-4 so what i need is to send to the RS232 port the query ?GA1 and get back on the display the value every 200ms. Can somebody help with this ......

Thanks Johan Holstein
superadnim
Enthusiast
Enthusiast
Posts: 480
Joined: Thu Jul 27, 2006 4:06 am

Post by superadnim »

PB 4.2x has a serial port lib, which is what you need. However I found that it is somewhat limited on the advanced side of the deal...

You may want to sniff the port when the device is in use with any current existent application, so you get to see what kind of setup it requires (what sort of authentication, etc).

Once that's ready, you can setup the library and send / receive data very easily, just as you would with the windows api.

I'm sure this example WILL NOT work but perhaps with a little adaptation you will get it to work.

Code: Select all

	; Syntax
	; Result = OpenSerialPort(#SerialPort, SerialPortName$, Bauds, Parity, Data, Stop, HandshakeMode, InputBufferSize, OutputBufferSize)

If OpenSerialPort(0, "COM4", 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
	
	Define.l is_there_data_to_read, read_amount
	Define.l timeout_now, timeout_max = 5000
	Define.l incoming = AllocateMemory(1024)
	
	If incoming
		
		WriteSerialPortString(0, "?GA1")
		
		Repeat
			Delay(10) : timeout_now + 10
			is_there_data_to_read = AvailableSerialPortInput(0)
		Until is_there_data_to_read Or (timeout_now => timeout_max)
		
		If is_there_data_to_read
			read_amount = ReadSerialPortData(0, incoming, Length)
			Debug PeekS(incoming, read_amount)
		Else
			Debug "timeout reached / no data to read"
		EndIf
		
		FreeMemory(incoming)
		
	EndIf
	
Else
	Debug "couldn't open com"
EndIf
Make sure you use the right COM and to setup the "connection" with the appropriate info. You may have to setup the "status" with SetSerialPortStatus() as well if signals are non-standard in the device.

I wish I could give you working code but without the device / specs I can't.

:lol: should I bash the keyboard and give up?
:?
Baldrick
Addict
Addict
Posts: 860
Joined: Fri Jul 02, 2004 6:49 pm
Location: Australia

Post by Baldrick »

Here is a little bit of a snippet from a little project I was working on a while back. It talks to a microcontroller & recieves return data in Hex format.
As superadnim said, very hard to know what you need without specs on your equipment. In my case, I have to send data 1 character at a time & wait for the controller to echo back before sending the next character. When the controller has recognised several symbols, it will then return a number in Hex format or an error if it doesn't recognise the character sequence sent, so in my case I just send my string, then delimit the total result to remove unwanted echo characters & then return the Hex as a decimal number.
All connection info such as baud rate, dbits.... is setup elswhere within my program.
Poll code:

Code: Select all

Structure Comms 
   Port.l
   hPort.l
   Baud.l
   DatBits.l
   StopBits.l 
   Handshake.l 
   InBuffer.l 
   OutBuffer.l 
   Status.l 
   Parity$ 
   PortName$ 
EndStructure 

Procedure Poll(*myDat.String) 
Shared Serial.Comms 
   With Serial 
    If IsSerialPort(\hPort)  
      For a.l=1 To Len(*myDat\s) 
       sDat$=Mid(*myDat\s,a,1) 
       WriteSerialPortData(\hPort,@sDat$,1) 
       Timer.l=ElapsedMilliseconds() 
        Repeat 
       In.l=AvailableSerialPortInput(\hPort) 
        If In 
         In$=Space(In) 
         ReadSerialPortData(\hPort,@In$,In) 
         Result$+In$  
        EndIf 
       TimerEnd.l=ElapsedMilliseconds() 
        If Timer+35<TimerEnd ; allow up to 35ms for reaction from relay controller
         TimeOut.l=1 
        EndIf 
       Until In Or TimeOut 
      Next 
     Result$=RemoveString(Result$,"S0") :Result$=RemoveString(Result$,"I0") 
     Result$=RemoveString(Result$,#CRLF$) :Result$=RemoveString(Result$,"#")  
      If Result$="" 
       \Status=0 
        Else 
       \Status=1
      EndIf 
     Result.l=@Result$
     ProcedureReturn Hex2Dec(@Result)   
    EndIf 
   EndWith 
EndProcedure 


The code in the main loop where polling is actually done:

Code: Select all

   If Update 
    Update=0     
    Dt$="S0"+#Commit :*Dt=@Dt$
    Status\Relay=Poll(@*Dt) 
    Dt$="I0"+#Commit :*Dt=@Dt$
    Status\Input=Poll(@*Dt) 
Using an timer API for polling period set upon succesfull connection:
Pollrate is set prior to connecting.

Code: Select all

Procedure poll_Timer() 
Shared Update.l
   Update=1 
EndProcedure 

       Case #Button_Connect 
         If Connect() 
          pEv.l=SetTimer_(WindowID(#Window_0),#pEv,PollRate,@poll_Timer()) 
          IpStat=-1 
         EndIf
This API timer is killed upon disconnection:

Code: Select all

       Case #Button_DisConnect 
         If DisConnect() 
          If pEv 
           KillTimer_(WindowID(#Window_0),#pEv) 
          EndIf
         EndIf
infratec
Always Here
Always Here
Posts: 7772
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: RS232 query device

Post by infratec »

If you want to do something with serial port and continiuos data,
you should definately use a thread for the communication part.

Bernd
User avatar
skywalk
Addict
Addict
Posts: 4283
Joined: Wed Dec 23, 2009 10:14 pm
Location: Boston, MA

Re: RS232 query device

Post by skywalk »

Remember Ascii compiles are going away, so you need to manage your strings. Writing strings has an Ascii option but ReadSerialPortData() does not. Use PeekS(*buf,-1,#PB_Ascii).
The nice thing about standards is there are so many to choose from. ~ Andrew Tanenbaum
infratec
Always Here
Always Here
Posts: 7772
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: RS232 query device

Post by infratec »

There was a troll on his way.
But it was to late, my answer was already written.
Post Reply