Have done a MAX module of this if anyone interested? Havenot tested it yet seems to be ok.
Code archives/User Input/COM-Port II
This code has been declared by its author to be Public Domain code.
Download source code
| File% = OpenCommPort%(0-255) ; -1 = Error Succes% = CloseCommPort%(File%) Size% = WriteComm%(File%, Bank%, Size%) Size% = ReadComm%(File%, Bank%, Size%) Succes% = SetComm%(File%, "Settings") Succes% = SetCommTimeouts%(File%, ReadMillisecs%, WriteMillisecs%) SetComm: http://msdn.microsoft.com/library/en-us/devio/base/buildcommdcb.asp?frame=true For example "baud=9600 parity=N data=8 stop=1": Sets baudrate to 9600 bits per second, no paritybit, 8 databits and 1 stopbit. Example: File% = OpenCommPort(1) SetComm(File%, "baud=9600 parity=N data=8 stop=1") SetCommTimeouts(File%, 500, 500) Repeat Message$ = Input("Message: ") If Message$ = "end" Then Exit ElseIf Message$ = "cls" Then Cls Locate 0, 0 Message$ = "" EndIf SendMessage(File%, Message$+Chr$(13)+Chr$(10)) Message$ = RecvMessage(File%) If Message$ <> "" Then Print 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 Just put your old modem on port 1, write "AT" (AT = Attention) press Return. Now you can communicate with your modem. For example "ATDT1234567" (D = Dail, T = Tone) or Hangup with ATH0. You just need the following comport.decls : .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" apiBuildCommDCB%(Def$, pDCB*) : "BuildCommDCBA" apiGetCommTimeouts%(File%, pCommTimeouts*) : "GetCommTimeouts" apiSetCommTimeouts%(File%, pCommTimeouts*) : "SetCommTimeouts" cu olli |
Const GENERIC_READ = $80000000 Const GENERIC_WRITE = $40000000 Const OPEN_EXISTING = 3 Const FILE_ATTRIBUTE_NORMAL = $80 Const INVALID_HANDLE_VALUE = -1 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 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 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 |
Comments
hey this works!!!!!
even works with home brew RS232 buffers!
even works with home brew RS232 buffers!
Thanks this seems to work, after adding the API stuff to my Kernal32.decl
some of the declarations already existed with api_ as show below
Yours : apiSetCommState%(File%, pDCB*) : "SetCommState"
Mine: api_SetCommState% (hCommDev%, lpDCB*) : "SetCommState"
some of the declarations already existed with api_ as show below
Yours : apiSetCommState%(File%, pDCB*) : "SetCommState"
Mine: api_SetCommState% (hCommDev%, lpDCB*) : "SetCommState"
I was searching for a Terminal, to test my At89S8252-processor, found a lot, but nothing good. Then I saw this, compiled and everything works now.
Thanks
Thanks
Exactly how do we use it? (I'm not great with advanced concepts like memory banks and stuff)
Hey Vertex, thanks for sharing.
I tried and it wooooorks!
I tried and it wooooorks!