Hi,

I am trying to alter the below piece of code for an interupt driven serial device.

I would like the 'Main' part of the program to run up until a serial command is received. I would also like the device to send comms back to VB, this is the reason i have inserted 'flags'.

The interrupts are only working with a single character. How would i use the interrupt so that it receives a string of commands.

ie using the SERIN command i would use SERIN RxD,baud,[WAIT(254), hrs, min, sec], can someone assist how would i achieve this using interrupts. I would like it so that when the command (254) is received it then stores the received hrs, min and sec variables in EEPROM.

If i can achieve this then it should be a good starting block to the rest of the code.

Code:
    '
    '   Simple program to handle USART interrupt using PIC16F877 @20MHZ
    '   ===============================================================
    '
    '   This program will Blink a LED on PORTB.0 to show
    '   that the PIC is running.  
    '
    '   This program also allow the user to activate or deactivate 
    '   a LED connected on PORTB.1 pin by sending command from a PC
    '   terminal software using 9600,n,8,1 setting
    '
    '   User command:
    '   =============
    '                1. If character "1" is received => enable the LED
    '                2. if character "2" is received => disable the LED
    '
    '
    DEFINE LOADER_USED 1        ' using bootloader
    DEFINE OSC 20               ' running at 20 MHZ
    ADCON1 = %00001111
    
    '    PORT setting
    '    ============
         '
         TRISC=%10000000        ' RC.7 => USART RX pin set to input
                                ' all other pin set to output
                                '
         TRISB=0                ' RB<7:0> set to output
    
    '    USART setting
    '    =============
         ' Since we will not use HSERIN/HSEROUT, we must
         ' write directly to internal PIC register
         ' 
         TXSTA=$24              ' enable transmit and SPBRGH=1
         RCSTA=$90              ' Enable USART and continuous receive
         SPBRG=129              ' BAUD RATE = 9600 BAUDS
   
    '    Interrupt definition
    '    ====================
         '
         PIE1.5   =1            ' enable USART receive interrupt
         INTCON.6 =1            ' enable peripheral interrupt
    
    '    Alias definition
    '    ================
         '
         RCIF      var PIR1.5   ' receiver interrupt
         StatusLED var PORTB.0  ' the LED who show a 'running process'
         UserLED   var PORTB.1  ' the LED that user want to control
         
    '    Variable definition
    '    ===================
         '
         Delay      var word     ' 
         DataIn     var word     ' use to store RCREG content
         Discard    var byte     ' use to erase RCREG register
         storedloop var byte
         Flag       var byte
        
    '    Hardware/software initialisation
    '    ================================
         '
         PORTB=0                ' clear PORTB         
         on interrupt goto USARTInterrupt

        
Start:
    '    Main program loop that make the user happy to
    '    see a LED flashing to mean that something is 
    '    running 
    '
    If flag = 1 then hserout [" Device Connected"]
    if flag = 2 then hserout [" LED is Flashing"]
    if flag = 3 then hserout [" LED is ON"]    
    If flag = 4 then hserout [" LED is OFF"]
    flag = 0
    
    toggle statusled
    for delay = 1 to 5000       ' use a loop delay to ensure
      pauseus 5                 ' getting interrupt as fast as
      next                      ' possible
    goto start
    

disable interrupt
USARTInterrupt:
    '    Here's the interrupt routine who will make the user
    '    much happy by giving him the feeling to have the 
    '    control on the machine when the status of the user
    '    LED will change
    '
    RCSTA=0                     ' Disable serial port AND
                                ' clear possible error (FERR,OERR)
                                
    datain=RCREG                ' Get data
                                
    while RCif                  ' wait untill the RCREG is empty
          discard=RCREG         ' by reading it and store result in a
    wend                        ' don't care variable
                                
    select case datain          ' What to do with that data???
                                
           case "#"             ' User selection = 1
                userled=1       '      => Enable the LED
                FLAG = 3         '      => disable the LED
           case "2"             ' User selection =2
                userled=0       '      => disable the LED
                flag = 4
           case "3"             ' User selection =321
                For storedloop = 1 to 5
                    High userled
                    Pause 50
                    Low userled
                    Pause 50
                Next storedloop
                flag = 2
            case "9"             ' User selection =2
                FLAG = 1         '      => disable the LED
                                
           end select
               
    RCSTA=$90                   ' Re-enable the serial PORT AND
    resume                      ' get out of here
enable interrupt
Many thanks for any help offered.

Steve