Com Port ansteuern

Übersicht BlitzBasic DLLs und Userlibs

Neue Antwort erstellen

Vertex

Betreff: Com Port ansteuern

BeitragSo, Mai 22, 2005 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe es gerade mit meinem alten 56k Modem nochmal getestet, und geht jetzt wunderbar...

Zitat:
.lib "kernel32.dll"


apiCreateFile%(FileName$, DesiredAccess%, ShareMode%, pSecurrityAttribute%, CreationDistribution%, FlagsAndAttributes%, TemplateFile%) : "CreateFileA"
apiCloseHandle%(Object%) : "CloseHandle"

apiWriteFile%(File%, pBuffer*, NumberOfBytesToWrite%, pNumberOfBytesWritten*, pOverlapped%) : "WriteFile"
apiReadFile%(File%, pBuffer*, NumberOfBytesToRead%, pNumberOfBytesRead*, pOverlapped%) : "ReadFile"



apiGetCommState%(File%, pDCB*) : "GetCommState"
apiSetCommState%(File%, pDCB*) : "SetCommState"
apiGetCommTimeouts%(File%, pCommTimeouts*) : "GetCommTimeouts"
apiSetCommTimeouts%(File%, pCommTimeouts*) : "SetCommTimeouts"


Code: [AUSKLAPPEN]
Const GENERIC_READ          = $80000000
Const GENERIC_WRITE         = $40000000
Const OPEN_EXISTING         = 3
Const FILE_ATTRIBUTE_NORMAL = $80
Const INVALID_HANDLE_VALUE  = -1
Const NOPARITY              = 0
Const ONESTOPBIT            = 0

Function OpenCommPort%(Port%)
   Local File%

   If (Port < 0) Or (Port > 255) Then Return -1
   
   ; Open CommPort
   File% = apiCreateFile("COM"+Port%, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)
   If File% = INVALID_HANDLE_VALUE Then
      Return -1
   Else
      Return File%
   EndIf
End Function

Function CloseCommPort%(File%)
   Return apiCloseHandle(File%)
End Function

Function WriteComm%(File%, Buffer%, Size%)
   Local Count%, Count2%

   If Size% > BankSize(Buffer%) Then Return 0
   
   Count% = CreateBank(4)
   
   If apiWriteFile(File%, Buffer%, Size%, Count%, 0) = 0 Then
      FreeBank Count%
      Return 0
   Else
      Count2% = PeekInt(Count%, 0)
      FreeBank Count%
      Return Count2%
   EndIf
End Function

Function ReadComm%(File%, Buffer%, Size%)
   Local Count%, Count2%
   
   If Size% > BankSize(Buffer%) Then Return 0
   
   Count% = CreateBank(4)
   
   If apiReadFile(File%, Buffer%, Size%, Count%, 0) = 0 Then
      FreeBank Count%
      Return 0
   Else
      Count2% = PeekInt(Count%, 0)
      FreeBank Count%
      Return Count2%
   EndIf
End Function

Function SetCommBaudrate%(File%, Baudrate%)
   Local DCB%
   
   DCB% = CreateBank(28)
   
   ; Get States
   If apiGetCommState(File%, DCB) = 0 Then
      FreeBank DCB%
      Return False
   ElseIf PeekInt(DCB%, 0) <> 28
      FreeBank DCB%
      Return False
   EndIf

   PokeInt  DCB%,  4, Baudrate   ; Baudrate
   PokeByte DCB%, 18, 8          ; Byte Size
   PokeByte DCB%, 19, NOPARITY   ; Parity
   PokeByte DCB%, 20, ONESTOPBIT ; StopBits
   
   ; Set States
   If apiSetCommState(File%, DCB%) = 0 Then
      FreeBank DCB%
      Return False
   Else
      FreeBank DCB%
      Return True
   EndIf
End Function

Function SetCommTimeouts%(File%, ReadTime%, WriteTime%)
   Local TimeOuts%
   
   ; Get timeouts
   Timeouts% = CreateBank(40)
   If apiGetCommTimeouts(File%, Timeouts%) = 0 Then
      FreeBank Timeouts
      Return False
   EndIf
   
   PokeInt Timeouts%,  8, ReadTime%  ; ReadTotalTimeoutConstant
   PokeInt Timeouts%, 16, WriteTime% ; WriteTotalTimeoutConstant
   
   ; Set Timeouts
   If apiSetCommTimeouts(File%, Timeouts%) = 0 Then
      FreeBank Timeouts
      Return False
   Else
      FreeBank Timeouts
      Return True
   EndIf
End Function


Beispiel:
Code: [AUSKLAPPEN]
File% = OpenCommPort(1)

SetCommBaudrate(File%, 9600)
SetCommTimeouts(File%, 100, 100)

Repeat
   Message$ = Input("Message: ")
   If Message$ = "end" Then Exit
   
   SendMessage(File%, Message$+Chr$(13))
   
   Message$ = RecvMessage(File%)
   DebugLog Message$
Forever

CloseCommPort(File%)
End

Function SendMessage%(File%, Command$)
   Local Buffer%, Offset%, Succes%
   
   Buffer% = CreateBank(Len(Command$))
   For Offset% = 0 To Len(Command$)-1
      PokeByte Buffer%, Offset%, Asc(Mid$(Command$, Offset%+1, 1))
   Next
   
   Success% = WriteComm(File%, Buffer%, Len(COmmand$))
   FreeBank Buffer%
   
   Return Success%
End Function

Function RecvMessage$(File%)
   Local Buffer%, Offset%, Count%, Message$
   
   Buffer% = CreateBank(1024)
   Count% = ReadComm(File%, Buffer%, 1024)
   If Count% > 0 Then
      For Offset% = 0 To Count-1
         Message$ = Message$+Chr$(PeekByte(Buffer%, Offset%))
      Next
      Return Message$
   Else
      FreeBank Buffer%
      Return ""
   EndIf
End Function


Im Menü "Program" vor "Debug Enabled?" ein Hacken machen, Modem an COM1 hängen und Programm starten.

"AT" für Attention eingeben, und Enter drücken. Nun kann man alle AT-Befehle angeben. Z. B. "ATDP123456789" für Dial+Pulse wählt die Nummer 123456789 über Impulswahl, "ATH" für Hangup legt wieder auf oder "ATLx" setzt die Lautsttörke x am Lautsprecher.

http://www.tcp-ip-info.de/tcp_...efehle.htm <- eine kleine Referenz dazu(danke an tft!).

mfg olli

Edit: Hatte vergessen Returnzeichen Chr$(13) an die Nachricht zu hängen.

Beim Empfangen erhält man auch Returnzeichen vom Modem, die Print nicht darstellen kann. Deswegen benutze ich DebugLog das dies kann.
vertex.dreamfall.at | GitHub

Vertex

BeitragMo, Mai 23, 2005 23:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Das kommt zusätzlich in die .decls Datei:
Zitat:
apiBuildCommDCB%(Def$, pDCB*) : "BuildCommDCBA"


Und das in die .bb Datei:
Code: [AUSKLAPPEN]
Function SetComm%(File%, Settings$)
   Local DCB%
   
   DCB% = CreateBank(28)
   
   ; Get States
   If apiGetCommState(File%, DCB) = 0 Then
      FreeBank DCB%
      Return False
   ElseIf PeekInt(DCB%, 0) <> 28
      FreeBank DCB%
      Return False
   EndIf
   
   ; Build DCB
   If apiBuildCommDCB(Settings$, DCB%) = 0 Then
      FreeBank DCB%
      Return False
   EndIf
   
   ; Set States
   If apiSetCommState(File%, DCB%) = 0 Then
      FreeBank DCB%
      Return False
   Else
      FreeBank DCB%
      Return True
   EndIf
End Function


SetCommBaudrate kann somit entfernt werden.

Beispiel:
SetComm(File%, "baud=9600 parity=N data=8 stop=1")

Beschreibung:
http://msdn.microsoft.com/libr...frame=true

Da kann man z. B. auch jetzt bequem dieses XOFF und XON Software Synkronisationsdingsbums einstellen, wenn man zwei PCs via Nullmodemkabel(nimmt man dazu ?oder) verbindet.

mfg olli
vertex.dreamfall.at | GitHub

tft

BeitragDi, Mai 24, 2005 7:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi.....

Super... ein dickes Dankeschön............
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

Blitzcoder

Newsposter

BeitragSo, Mai 29, 2005 9:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

com=openfile("COM1")

repeat
a$=input("Message: ")
writeline com,a$
forever
[/quote]
  • Zuletzt bearbeitet von Blitzcoder am So, Mai 29, 2005 9:03, insgesamt einmal bearbeitet

Vertex

BeitragSo, Mai 29, 2005 14:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Man muss aber die Baudrate, Parität, Stopbits usw. einstellen können. Ein Modem das mit 9600 Bits pro Sekunde arbeitet, kann nicht mit 56000 Bist pro Sekunde arbeiten. Das ist auch nicht von der Architektur gegeben, das sich bei Geräte in der Baudrate, Stopbits usw. synkronisieren.

Da du bei OpenFile nicht das File-Handle kommst, kannst du auch nicht diese Einstellungen treffen.

mfg olli
vertex.dreamfall.at | GitHub

Blitzcoder

Newsposter

BeitragSo, Mai 29, 2005 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt!

Aber ich hatte früher den LEGO Cybermaster!

DAs ist ein ferngesteuertes LEGO-Modell!

Ich habs vor ein paar Wochen mal wieder rausgeholt, und mit openfile() gehackt! Hab einfach Befehle an den COM-Port geschickt(Da hängt der Sender dran)!
Mit den Befehlen aus dem i-net gings!

Vertex

BeitragSo, Mai 29, 2005 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Es geht entweder weil a) die Standardeinstellung (siehe System -> Hardwaremanager -> COM) stimmen, oder b) das Legoding sich synkronisieren kann. (Mein Modem kann das übrigens auch)

Dennoch hängt er sich z. B. bei auf, wenn ich mal schnell hintereinanderer ReadByte mache. Das ist mit der Userlib nicht der Fall.

mfg olli
vertex.dreamfall.at | GitHub

tft

BeitragSo, Jun 05, 2005 7:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi...

das nennt man AutoHandShaking........ das können alle Hayns kompatiblen Modems
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

tft

BeitragSo, Jun 05, 2005 7:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi... Vertex

kanst du das auch für den USB Bus machen?
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

Vertex

BeitragSo, Jun 05, 2005 18:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Generell ist USB an einen Treiber gebunden. Ich müsste mal schauen, ob BulkWrite und BulkRead bei allen Treibern vorhanden ist, jedoch hat das sicher keinen Sinn. Z. B. musste ich bei meinem F2A Flasher noch immer die Firmware auf den Flasher per USB downloaden, um Daten übertragen zu können.
mfg olli
vertex.dreamfall.at | GitHub

Sebastian

BeitragSa, Jun 18, 2005 12:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ähm Vertex ......

Ich glaub ich hab mal wieder ein kleines Problem(chen).

Ich hab zum Testen einfach mal COM1 und COM2 per Nullmodem-kabel verbunden.
Senden läuft perfekt aber mit dem empfang harkts ein wenig ...

Das D.-log ist voller $0D bytes, aber das was ich gesendet hab ist nicht drin .....

Keine Ahnung woran das liegen könnte ...
Seit 2 Jahren kein BlitzBasic und kein Windows mehr, und stolz darauf !

Vertex

BeitragDi, Jun 21, 2005 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Sendest du reinen Text? Wenn ja, kannst du mal Softwarehandshaking via XON/XOFF - Protokoll es versuchen. Benutzt du die selbe Baudrate?
mfg olli
vertex.dreamfall.at | GitHub

Sebastian

BeitragMi, Jun 22, 2005 17:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat sich erledigt .....

Mach das Prog jetzt in C++ ....
Seit 2 Jahren kein BlitzBasic und kein Windows mehr, und stolz darauf !

Lunatix

BeitragSo, Sep 18, 2005 10:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey!

Kann man das auch zweckentfremden, heißt, die pins mit strom/nicht strom belegen und da lämpchen dranhängen(mit schaltung, transistoren etc.)

Also ich leg auf 1 und 7 spannung und der transistor T8 schaltet lampe L8
an?
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...

Vertex

BeitragDi, Sep 27, 2005 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm der COM Port arbeitet denke ich mit Spannungspotentialen von +12 und -12 Volt (gegen Masse gemessen). Bin kein Technikfreak, aber hier würde ich denke ich Optokopler verwenden, damit man das Mainboard nicht zerschießen kannst, kann sicher nur wenige Milliampere aushalten. Bei einer LED dürfte da aber denke ich nix passieren, bei einem Relais aber schon eher.
Naja musst mal durchgooglen...
mfg olli
vertex.dreamfall.at | GitHub
 

super_castle

BeitragSo, Dez 18, 2005 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo, der puffer ist nur 4096 byte gross. wie kann ich ihn auf 16k erhöhen?

weiss nicht wie ich es in der userlib schreiben soll.
danke für die hilfe.

mfg castle
  • Zuletzt bearbeitet von super_castle am Mi, März 22, 2006 19:12, insgesamt 2-mal bearbeitet
 

super_castle

BeitragSo, Dez 18, 2005 14:47
Antworten mit Zitat
Benutzer-Profile anzeigen
habe den befehl für die erhöhung des rs232-buffers gefunden.

nehme jetzt aber meine eigene rs232routine-dll, die ich mit purebasic geschrieben habe, weil sie schneller ist.
mit der purebasic-dll brauche ich für das einlesen des bildes in den rs232-buffer 5,5 sec und bei b3d mit der obigen direkt eingebundenen routine 8 sec.

mfg castle

Neue Antwort erstellen


Übersicht BlitzBasic DLLs und Userlibs

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group