I have a program to read out the data from a sensor using RS232. According to the manufacturer the 4-byte hex output from the sensor should be converted to a two's complement, converted to a decimal and then divided by 70 to get the correct flow.
Unfortunately I cannot find any command oin CRBASIC that handles convertion of hex or dec to binary which would be the easiest way to find the two's complement. I have tried subtracting each byte from F and adding 1 but this is not giving the correct result.
Does anyone have any idea how I can do this? Below is my example code.
'CR1000X Series Datalogger 'Sensirion ASF1430 MFC for O3 flow Public O3flow(1) As String *36 Public O3flow_in1 As Long Public O3flow_in2 As String *36 Units O3flow = sccm 'MAIN PROGRAMM BeginProg 'Configure RS232 Sensirion MFCs for flows 'SerialOpen(ComC5,19200,19,0,200,0) Scan (500,mSec,100,0) ' Measure System parameters 'Read Sensirion flow meter: 'SerialInBlock (ComC5,O3flow_in1,36) 'O3flow_in2=Hex(O3flow_in1) 'SplitStr (O3flow(),O3flow_in2,"7F7F",1,4) 'Use O3flow=87AE to test O3flow()= "87AE" 'Get two's complement: O3flow()=&HF -O3flow(1,1,1) & &HF- O3flow(1,1,2)& &HF- O3flow(1,1,3)& &HF- O3flow(1,1,4) + &H1 O3flow()=HexToDec(O3flow())/70 '70 is the calibration factor. NextScan EndProg
Sounds like a 16 bit signed integer.
Public FlowString As String * 4 = "87AE" Public tempInteger As Long Public Flow As Float 'Main Program BeginProg Scan (1,Sec,0,0) tempInteger = HexToDec(FlowString) If tempInteger AND &h8000 Then 'Check sign bit 'Alternative check: If tempInteger > 32767 Then tempInteger = tempInteger - 65536 'A shortcut for flipping bits correctly EndIf Flow = tempInteger / 70 NextScan EndProg