[Gambas-user] FW: Serial and Multiserial Problem

dimitris tsiou dgtsiou at ...67...
Sun Jan 13 11:19:58 CET 2013






Thank you for the answer. I had the same problem with 2.24 so I downgrade gambas version to 2.21. 

This is a code snippet of what I wrote.


PUBLIC CTimeOut AS Timer


PUBLIC FUNCTION initialize() AS Boolean
    DIM s AS String
    DIM Derror AS Integer = 0
    DIM i AS Integer = 0
    DIM sout AS String = ""
    
    CTimeOut = NEW Timer AS "CTimeOut"
    CTimeOut.Delay = 300
    
    FMain.ProgressBarTest.value = 0.00
    FMain.TextAreaInformation.Background = &HFFFF00&  
    FMain.TextAreaInformation.Text = "\n\n\n\n\n\t\t\t" & "Init...\n"
    FMain.TextAreaInformation.Font.Size = 15


    'Init Controller Module (AVR)

    IF Settings["Station/Init"] = TRUE THEN 
        sout = MStation.init()
        IF sout = NULL THEN Error.Raise("STATION")
        FMain.TextAreaTrace.Text = Format(Now(), "hh:nn:ssuuuu: ") & "STA > " & sout & FMain.TextAreaTrace.Text 
    ENDIF 
   
    CTimeOut.Start()
    WAIT 1
    MStation.reset()
    WAIT 0.4
    
    
    RETURN TRUE
  
  CATCH
   s = "\n" & Format(Now(), "hh:nn:ssuuuu") & " - " & "Error during Initialization...\n" &
   "Process Error: " & Error.Class.Name & "\n" &
   "Error Text: " & Error.Text & "\n" &
   "Error Code: " & Derror & "\n"
   
   FMain.TextAreaInformation.Text = FMain.TextAreaInformation.Text & s
   FMain.TextAreaTrace.Text = FMain.TextAreaTrace.Text & s
   FMain.TextAreaInformation.Background = &HFF0000&
   FMain.TextAreaError.Text = FMain.TextAreaError.Text & s 
   DEBUG s
   
   RETURN FALSE 
END



PUBLIC SUB CTimeOut_Timer()
  
  CTimeOut.Stop()
  MStation.CDataRead()
  CTimeOut.Start()
  
END



PUBLIC FUNCTION CDataRead() AS String
   DIM i AS Integer = 0
   DIM index AS Integer
   DIM Derror AS Integer
   DIM buf AS String = ""
   DIM sout AS String= ""
   DIM StationStatus AS String = ""
   DIM StationError AS String = ""
  
   
   CurrentPortByte = ""
   
   TRY READ #SPort, buf, Lof(SPort)
   RxSport &= buf
   
   
   WHILE TRUE
      i = InStr(RxSport, "\n", 1)
      IF i = 0 THEN BREAK 
      buf = Left(RxSport, i)
      RxSport = Right(RxSport, Len(RxSport) - i)
      FMain.TextAreaTrace.Text = Format(Now(), "hh:nn:ssuuuu: ") & "STA > " & buf & FMain.TextAreaTrace.Text
      
      '------ Manipulate Controller's data -------'
      
      'Port Signals
      IF buf = "F?\n" THEN 
          CurrentPortByte = Left(RxSport, 2)
          PRINT Left(buf, 2) & " --> PORTF: " & CurrentPortByte
      ENDIF 
        
      IF buf = "C?\n" THEN 
          CurrentPortByte = Left(RxSport, 2)
          PRINT Left(buf, 2) & " --> PORTC: " & CurrentPortByte
      ENDIF
        
      'Inputs
      IF InStr(buf, "inputs:") <> 0 THEN 
          PRINT buf
      ENDIF
      
      'Status
      IF InStr(buf, "status:") <> 0 THEN 
          index = InStr(buf, "s:", 1)
          StationStatus = Mid(buf, index + 2, 1) 
          PRINT "StationStatus: " & StationStatus
          
          IF StationStatus = "5" THEN 
              sout = "New device\n"
              FMain.TextAreaTrace.Text = Format(Now(), "hh:nn:ssuuuu: ") & "STA > " & sout & FMain.TextAreaTrace.Text
              FMain.TextAreaSpec.Text = ""
              FMain.TextAreaInformation.Text = sout
              FMain.TextAreaInformation.Background = Color.Yellow
          ENDIF 
          
          IF StationStatus = "7" AND IsTestRunning = FALSE THEN 
                IsTestRunning = TRUE
         
                sout = "New Test\n"
                FMain.TextAreaInformation.Text &= sout
                FMain.TextAreaTrace.Text = Format(Now(), "hh:nn:ssuuuu: ") & "STA > " & sout & FMain.TextAreaTrace.Text
                TestMod.TestExec()     
           ENDIF
      ENDIF
    
      'Errors
      IF InStr(buf, "error!:") <> 0 THEN 
          index = InStr(buf, "or!:", 1)
          StationError = Mid(buf, index + 4, 1)
          PRINT "StationError: " & StationError
      
          IF StationError = "@" THEN 
            sout = "Error: Overflow\n."
          ENDIF 
          
          IF StationError = "A" 
            sout = "Error (A)"
          ENDIF
          
          IF StationError = "C"
            sout = "Error (C)\n" 
          ENDIF
          
          IF StationError = "F"
            sout = "Error (F)\n" 
          ENDIF
          
          IF StationError = "G"
            sout = "Error (G)\n" 
          ENDIF
          
          IF StationError = "H"
            sout = "Error (H)\n" 
          ENDIF
          
          IF StationError = "Q"
            sout = "Error (Q)\n" 
          ENDIF
          
          FMain.TextAreaError.Text = Format(Now(), "hh:nn:ssuuuu: ") & "STA > " & Settings["Station/" & Mid(buf, 8, 1)] & "\n\r" & FMain.TextAreaError.Text
          FMain.TextAreaError.Text = Format(Now(), "hh:nn:ssuuuu: ") & "STA > " & Left(buf, 8) & FMain.TextAreaError.Text
          FMain.TextAreaError.Text = Format(Now(), "hh:nn:ssuuuu: ") & "STA > " & sout & FMain.TextAreaError.Text
          FMain.TextAreaTrace.Text = Format(Now(), "hh:nn:ssuuuu: ") & "STA > " & Settings["Station/" & Mid(buf, 8, 1)] & "\n\r" & FMain.TextAreaTrace.Text
          FMain.TextAreaTrace.Text = Format(Now(), "hh:nn:ssuuuu: ") & "STA > " & Left(buf, 8) & FMain.TextAreaTrace.Text
          FMain.TextAreaTrace.Text = Format(Now(), "hh:nn:ssuuuu: ") & "STA > " & sout & FMain.TextAreaTrace.Text
          FMain.TextAreaInformation.Text = FMain.TextAreaInformation.Text & Format(Now(), "hh:nn:ssuuuu: ") & Settings["Station/" & Mid(buf, 8, 1)] &"\n\r" & sout
          FMain.TextAreaInformation.Background = Color.Red
          
          IF FStation.Visible THEN 
              FStation.TextAreaRx.Text = "@" & Sport.PortName & ">: " & Settings["Station/" & Mid(buf, 8, 1)] & "\n\r" & FStation.TextAreaRx.Text
          ENDIF 
      ENDIF 

      buf = ""
  WEND
   
  CATCH 
       'Error.Raise("CDataRead(): " & Error.Text)
END




Is it possible that the timer event every 300ms is responsible for data corruption?

Thanks again.







From: dgtsiou at ...67...
To: gambas-user at lists.sourceforge.net
Subject: Serial and Multiserial Problem
Date: Fri, 11 Jan 2013 13:47:39 +0000





Hello to everyone, I wish you a happy new Year!

I am gambas user at about 4 months and I am developing a system for control automation on a Ubuntu 10.04. I'm using the Gambas 2.21 runtime. I have also tried Ubuntu 11.04 for my application. The problem's description is as follows: 

An AVR micro polls for some sensor signals and sends asynchronous msgs to the ubuntu PC via /dev/ttyS0. The PC is also communicates with other devices via serial port lines using a multi-serial 4-port RS-232 (PCI card). 

After 2-3 hours of normal operation the Control program, running on the ubuntu PC, receives corrupted/no data from the micro. Initially, I was using the event based mechanism for the data reception with Sport_read() event. When the aforementioned problem was raised, I changed my design and I removed the Sport_read by creating an idle event (with a timer event every 300 msecs) and executing READ calls in order to receive micro's data. After Read, the data manipulation is following. 
Unfortunately the same problem remains with data received by gambas application. I have already checked the messages transmitted from the micro with cutecom/minicom and it seems that everything is ok (messages successfully delivered). 

When I restart the PC (Not the application!) then everything works fine again for another time interval of 3-4 hours.

Has anyone an idea why this happens? Every answer will be really valuable for me.

Thank you in advance 		 	   		  
 		 	   		  


More information about the User mailing list