Com Port ansteuern
Übersicht

![]() |
VertexBetreff: Com Port ansteuern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 !!!!!! |
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] com=openfile("COM1") repeat a$=input("Message: ") writeline com,a$ forever |
||
- Zuletzt bearbeitet von Blitzcoder am So, Mai 29, 2005 9:03, insgesamt einmal bearbeitet
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ä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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hat sich erledigt .....
Mach das Prog jetzt in C++ .... |
||
Seit 2 Jahren kein BlitzBasic und kein Windows mehr, und stolz darauf ! |
![]() |
Lunatix |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group