Hello,
Perhaps something like this
/Henrik.Code:CMD VAR BYTE TestVar1 VAR BYTE TestVar2 VAR BYTE HSERIN [CMD] Select Case CMD Case "A" HSERIN[DEC4 TestVar1] Case "B" HSERIN[DEC4 TestVar2] END SELECT
Hello,
Perhaps something like this
/Henrik.Code:CMD VAR BYTE TestVar1 VAR BYTE TestVar2 VAR BYTE HSERIN [CMD] Select Case CMD Case "A" HSERIN[DEC4 TestVar1] Case "B" HSERIN[DEC4 TestVar2] END SELECT
Thanks a lot Henrik, it works fine.
The only problem I got is that HSERIN hangs my loop...
Yes, that's the way it works....
If the loop time is less that 2 "byte-times" you can poll the receive flag each time thru the loop and get the byte(s) from the receive buffer. If the loop time is longer you need to use interrupts.
/Henrik.
Hmm right now I just want to retreive a 4-number decimal value in my loop, and put it in the "ref" variable. I don't even need a letter, I just send raw numbers (in ASCII) , like "0586" from my computer.
The problem is that in my program I use very precise and quick timing interrupts so it's a bit annoying.
Maybe there is a way to send not an ASCII number but directly a hex number, so 0586 will be 24A... max value is 1200 (4B0, so I use 2 bytes)
I have no idea how to use the RX buffer...
Last edited by pxidr84; - 21st April 2013 at 21:43.
You can add timeout label. Then it won't hang forever..
HSERIN 10,TimeOut, [CMD]
Code:Select Case CMD Case "A" HSERIN 10,TimeOut,[DEC4 TestVar1] Case "B" HSERIN 10,TimeOut,[DEC4 TestVar2] END SELECT TimeOut:
Hi,
This is totally untested but could serve as a starting point for a polled receive buffer. Short of this you need to use interrupts to receive the data in the background but I suspect that with your timing sensetive loop even that might cause to much problem.
/Henrik.Code:RC1IF VAR PIR1.5 'Alias to Interrupt request bit for USART1, double check against datasheet. RxData VAR BYTE[5] Value VAR WORD ByteCount VAR BYTE TestVar1 VAR WORD TestVar2 VAR WORD ByteCount = 0 ' Reset buffer pointer. Main: ' Main loop has to run faster than the bytes can arrive. If RC1IF THEN ' Is there a byte in the receive buffer? HSERIN[RxData[ByteCount]] ' Get it and put in the buffer array, RCIF will be cleared by the hardware. IF ByteCount = 4 THEN ' Do we have 5 bytes yet? GOSUB ProcessFrame 'If so go process them... ELSE ByteCount = ByteCount + 1 ' If not, get ready for the next. ENDIF ENDIF Goto Main ProcessFrame: ByteCount = 0 ' Get ready for next frame. ' Now convert the next 4 bytes from ASCII to a numeric value. ' Could probably use ArrayRead here instead. Value = (RXData[1] - 48) * 1000 Value = Value + ((RxData[2] - 48) * 100) Value = Value + ((RxData[3] - 48) * 10) Value = Value + (RxData[4] - 48) If RxData[0] = "A" THEN TestVar1 = Value ENDIF If RxData[0] = "B" THEN TestVar2 = Value ENDIF RETURN
Bookmarks