Code archives/User Input/COM-Port II

This code has been declared by its author to be Public Domain code.

Download source code

COM-Port II by Vertex
(Posted 22 years ago)
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

Nigel Brown
(Posted 22 years ago)
Have done a MAX module of this if anyone interested? Havenot tested it yet seems to be ok.

Neochrome
(Posted 21 years ago)
hey this works!!!!!
even works with home brew RS232 buffers!

Lane
(Posted 20 years ago)
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"

Mr. Bean
(Posted 20 years ago)
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

schilcote
(Posted 18 years ago)
Exactly how do we use it? (I'm not great with advanced concepts like memory banks and stuff)

Litobyte
(Posted 18 years ago)
Hey Vertex, thanks for sharing.

I tried and it wooooorks!

Code Archives Forum