Salve a tutti,
iIo stavo realizzando un programma che fa le seguenti cose:
-il mio programmino dovrebbe ricevere i dati da un pc esterno tramite una connessione seriale sulla COM1
-i dati sono in formato file txt(piccolissimi, 1 kb)
-una parte dei dati viene visualizzata sul pc ricevente ed immessa in un record.
Funziona tutto bene se non fosse che, ad esempio, dopo aver spedito 13 volte lo stesso file, al 14° invio mi appare "Errore di run-time '13' Tipo non corrispondente" e il programma si pianta.
Come mai? Cioe' perche' a volte l'invio riesce perfettamente e a volte mi compare l'errore invece?
Questo e' il codice Form_Load:
codice:
Private Sub Form_Load()
Reload:
' Int seriale
Set Comm = New DatiBilancia
Comm.CommPort = 1
Comm.Settings = "19200,N,8,1"
Comm.OpenPort
If Comm.State = 0 Then
MsgBox "Impossibile aprire la porta"
Comm.ClosePort
GoTo Reload
End If
p = 0
' Attiva il timer per la lettura periodica sulla porta seriale
Me.TimerInterval = 1000
End Sub
Questo e' il codice del Form_Timer:
codice:
Private Sub Form_Timer()
dato = Comm.Rx
If (dato <> 0) Then
nuovo_record:
If (x < MaxBB) Then
DoCmd.GoToRecord , , acNewRec
Me.Lotto.Value = Form_MasInsacco.Lotto.Value
Me.Numero.Value = Form_MasInsacco.Numero.Value
' Me.CodiceProdotto.Value = Form_MasInsacco.Prodotto.Value
Me.Peso.Value = dato
Me.BigBag.Value = x
x = x + 1
' qui devo aspettare di ricevere i dati data, ora e peso
Else
DoCmd.GoToRecord , , acNewRec
Me.Lotto.Value = Form_MasInsacco.Lotto.Value
Me.Numero.Value = Form_MasInsacco.Numero.Value
' Me.CodiceProdotto.Value = Form_MasInsacco.Prodotto.Value
Me.Peso.Value = dato
Me.BigBag.Value = x
GoTo fine
End If
GoTo end_sub
fine:
DoCmd.Close
end_sub:
End If
End Sub
E questo e' il codice della funzione Rx del modulo DatiBilancia:
codice:
'Lettura della porta seriale
Public Function Rx() As Double
Const BufferLen = 66
Dim ReceivedBytes As Long
Dim Buffer(BufferLen - 1) As Byte
Dim fSuccess As Integer
Dim ferror As Integer
Dim PesoReceive As String
Dim Testo As String
Dim Ok As Integer
Dim Conf1 As Integer
Dim Conf2 As Integer
Dim Autotara As Double
Dim Soglia1 As Double
Dim Soglia2 As Double
Dim PesoFinale As Double
Dim CorrStat As Double
Dim SogliaFinale As Double
Dim TempoCiclo As Double
Dim TempoVeloce As Double
Dim TempoLento As Double
Dim CodicePeso As String
Ok = 0
'Se la porta non è aperta esco
If Not (hCom > 0) Then
Exit Function
End If
' legge dalla porta seriale; in particolare, imposta a 0 (NULL)
' l'ultimo parametro della ReadFile, poiche' la comunicazione
' sara' sincrona (non overlapped)
fSuccess = ReadFile(hCom, Buffer(0), BufferLen, ReceivedBytes, 0)
If (ReceivedBytes = 0) Then
Exit Function
End If
If (fSuccess <> 0) Then
'if ((Buffer(0) = "0x13)&(Buffer(1) = "0x10))
PesoReceive = Left(StrConv(Buffer(), vbUnicode), ReceivedBytes)
Testo = Left(PesoReceive, 3)
Conf1 = StrComp(Testo, Chr$(13) & Chr$(10) & "+", 1)
Conf2 = StrComp(Testo, Chr$(13) & Chr$(10) & "-", 1)
If ((Conf1 = 0) Or (Conf2 = 0)) Then
Ok = 1
Autotara = CDbl(Mid$(PesoReceive, 2, 7))
Soglia1 = CDbl(Mid$(PesoReceive, 9, 7))
Soglia2 = CDbl(Mid$(PesoReceive, 16, 7))
PesoFinale = CDbl(Mid$(PesoReceive, 23, 7))
CorrStat = CDbl(Mid$(PesoReceive, 30, 7))
SogliaFinale = CDbl(Mid$(PesoReceive, 37, 7))
TempoCiclo = CDbl(Mid$(PesoReceive, 44, 7))
TempoVeloce = CDbl(Mid$(PesoReceive, 51, 7))
TempoLento = CDbl(Mid$(PesoReceive, 58, 7))
CodicePeso = Mid$(PesoReceive, 66, 1)
End If
Else
ferror = Err.LastDllError
' gestione errore
End If
If (Ok = 1) Then
Rx = PesoFinale
End If
End Function
Vi ringrazio in anticipo