Nån som vet nått referens ställe där man kan läsa om hur man kommuniserar med com porten?? tja om du vill skriva VB-program som snackar RS232 så duger VB-hjälpen rätt bra....... Spännande att råka ut för en annan lösning... Eller varför inte testa dessa: Förmodligen just därför som jag adderar 2 till vissa uttryck -1+2 = 1, grundregeln var toggla mellan 0 och ett, bara för att begränsa sig lite....Comportar......
Sv: Comportar......
Det svåra är inte att snacka ut på porten det sköter MSCOMM-komponenten åt dig. Krånglet är i regel att du ibland måste följa vissa protokoll. Exempel på protokoll kan vara CANbus, PROFIBUS, MODBUS eller något annat protokoll..
I mitt jobb händer det ofta att jag måste koda en komponent som kan snacka med andra instrument på ett RS485 nätverk, ungefär lika som ett RS232 fast det är ett multidrop och det är andra signalnivåer, varför man använder en RS232 till RS485 konverter.
Nåja här kommer lite kort info hur du enklast bygger en kommunikationsrutin exvis för att avlyssna komporten..
Förrsten man kan använda två olika metoder i huvudsak. Polling eller eventstyrt. Vid Polling frågar man med jämna mellanrum porten om det kommit data. I det andra fallet (som är det bästa, oftast) låtar man ett event triggas av att data kommer till porten. Då kan man syssla med annat tills det finns data att hämta. (Nästan som interrupt alltså)
Säkerställ att du anger porten som ditt modem sitter på.
============================================
1. Högerklicka i toolboxen och lägg till komponenten Microsoft Comm Control 6.0
2. Drag in denna komponenten i en form.
3. Lägg en Commandbutton på formen också.
4. En timer lägger du också dit
5. klistra in koden nedan.
Option Explicit
Private Sub Command1_Click()
Static p As Boolean
p = True - p 'Toggla värdet på p för varje tryck
If p Then
Command1.Caption = "Stäng COM" & MSComm1.CommPort
'Kolla så att inte porten är öppen av någon annan applikation
'Är den inte det så öppna den.
If Not MSComm1.PortOpen = True Then MSComm1.PortOpen = True
'Starta timer
Timer1.Enabled = True
Else
Command1.Caption = "Lyssna COM" & MSComm1.CommPort
MSComm1.PortOpen = False
'Stoppa timer
Timer1.Enabled = False
End If
End Sub
Private Sub Form_Load()
'Ställ in parametrar för COM-porten
'9600 baud, andra giltiga värden: 110,300,600,1200,2400
'9600 (Default),14400,19200,28800,38400,56000,128000,256000
'N = No Parity (ingen paritetsbit) Kan vara E = Even, M = Mark
'N = Ingen, O = Udda, S = Space
'8 databitar, kan vara 4,5,6,7 eller 8, 8 är absolut vanligast
'men 7 förekommer ofta i olika fältbuss sammanhang
'1 stoppbit, kan vara 1,1.5 eller 2 1 är default
MSComm1.Settings = "9600,N,8,1" 'Defaultinställning
'Tala om vilken port du vill lyssna på
'1 = COM1
'2 = COM2
MSComm1.CommPort = 2
'Ange inbuffertens storlek... 1024 är default, blir den full
'Går information förlorad
MSComm1.InBufferSize = 1024
'När antalet tecken i inbufferten är lika med eller
'fler än vad som anges för egenskapen RThreashold
'triggas eventet onComm och man kan hämta datat.
'Det finns många flera saker som kan trigga detta event.
'Vad som triggat det kan man utläsa i egenskapen MSComm1.CommEvent
MSComm1.RThreshold = 256
'Nu är väl alla egentliga inställningar gjorda.
'En del applikationer kräver handskakning och sånt
'Men nu skall vi bara lyssna så det går bra utan.
Command1.Caption = "Lyssna COM" & MSComm1.CommPort
'Sätt timern. Vid varje timer_event skickas en fråga till modemet
'Denna teknik används bara för att man inte kan skicka hela
'klabbet av frågor direkt... Modemet hinner inte med...
Timer1.Interval = 100 '0.5 sekunder (500 ms)
Timer1.Enabled = False
End Sub
Private Sub MSComm1_OnComm()
'Detta event triggas bland annat av att det fins ett visst
'Antal tecken på commporten. Nämligen RThreashold stycken
Dim dataRad() As String
Dim commPortsData As String
Dim str As String
Dim i As Integer
'Kolla om det är data på porten som utlöst eventet
'Det kan vara ett kommunikationsfel också.
If MSComm1.CommEvent = comEvReceive Then
'Läs data från porten
commPortsData = MSComm1.Input
'Splitta datat i en array, trix för att få bort vbrlf
dataRad() = Split(commPortsData, vbCrLf & vbCrLf, -1, vbTextCompare)
'Skriv ut datat.... i debugfönstret
For i = 0 To UBound(dataRad())
Debug.Print "dataRad(" & CStr(i) & ") = "; dataRad(i)
Next i
Else
MsgBox "Event utlöst av annat än att RThreashold st tecken finns in inbufferten'"
End If
End Sub
Private Sub Timer1_Timer()
'Denna kod finns bara till för att generera lite snack på COM-porten
'Den avfrågar modemet om lite olika parametrar
'Skicka lite hayes-kommandon till modemet så vi får svar. se länk nedan
'http://pvhwsdte.ped.hisingensvux.educ.goteborg.se/martinf/hayes.html
Static i As Integer
'Bygg och skicka frågesträngen till modemet
MSComm1.Output = "ATS" & CStr(i) & "?" & vbCrLf
i = i + 1
'S11 är det högsta registret
If i = 12 Then i = 0
End Sub
=============================================
Lycka till
/peterh <=> hpeterSv: Comportar......
Själv har jag använt "p = Not p".
Inte för att hastigheten på just denna operation påverkan är något som behövs optimeras.
Här är testet jag utförde:
Private Sub Form_Load()
Dim Value As Boolean
Dim Index As Long
Dim StartTime As Single
StartTime = Timer
For Index = 1 To 100000
Value = True - Value
Value = True - Value
Value = True - Value
Value = True - Value
Value = True - Value
Next
Debug.Print "True: "; Timer - StartTime
StartTime = Timer
For Index = 1 To 100000
Value = Not Value
Value = Not Value
Value = Not Value
Value = Not Value
Value = Not Value
Next
Debug.Print "Not: "; Timer - StartTime
StartTime = Timer
For Index = 1 To 100000
Value = True - Value
Value = True - Value
Value = True - Value
Value = True - Value
Value = True - Value
Next
Debug.Print "True: "; Timer - StartTime
StartTime = Timer
For Index = 1 To 100000
Value = Not Value
Value = Not Value
Value = Not Value
Value = Not Value
Value = Not Value
Next
Debug.Print "Not: "; Timer - StartTime
StartTime = Timer
For Index = 1 To 100000
Value = True - Value
Value = True - Value
Value = True - Value
Value = True - Value
Value = True - Value
Next
Debug.Print "True: "; Timer - StartTime
StartTime = Timer
For Index = 1 To 100000
Value = Not Value
Value = Not Value
Value = Not Value
Value = Not Value
Value = Not Value
Next
Debug.Print "Not: "; Timer - StartTime
End SubSv: Comportar......
Kravet är att första toggeln måste ge 1 därefter måste den toggla mellan 0 och 1 alternativt att första är true och den pendlar mellan true och false.
p = 1 - p 'Standard
p = (Not p) + 2
p = (p Imp Not p) + 2 'Intressant med logisk implikation
p = Abs(p - 1)
p = (p Imp False) + 2
p = True - p + 2
p = 1 Xor p
p = (0 Eqv p) + 2 'Logisk ekvivalens
p = (p + 1) Mod 2
p = ((p + 1) And (p - 1))
Kommer du på flera ??
/peterh <=> hpeterSv: Comportar......
Annars finns det så många sätt att göra det på.
/peterh