© MCS Electronics, 1995-2007
X must point to the target string, Z must point to the source string.
The generated ASM code : (can be different depending on the micro used ) ;##### Z = Ucase(s)
Ldi R30,$60
Ldi R31,$00 ; load constant in register Ldi R26,$6D
Rcall _Ucase
Example
$regfile = "m48def.dat" |
' specify the used |
micro |
' used crystal |
$crystal = 4000000 |
frequency |
' use baud rate |
$baud = 19200 |
$hwstack = 32 |
' default use 32 |
for the hardware stack |
' default use 10 |
$swstack = 10 |
for the SW stack |
' default use 40 |
$framesize = 40 |
for the frame space |
|
Dim S As String * 12 , Z As String * 12 |
|
S = "Hello World" |
|
Z = Lcase(s) |
|
Print Z |
|
Z = Ucase(s) |
|
Print Z |
|
End |
|
UDPREAD
Action
Reads data via UDP protocol.
Syntax
Result = UDPREAD( socket , var, bytes)
Remarks
Result |
A byte variable that will be assigned with 0, when no errors occured. |
|
When an error occurs, the value will be set to 1. |
|
When there are not enough bytes in the reception buffer, the routine will |
|
wait until there is enough data or the socket is closed. |
socket |
The socket number you want to read data from(0-3). |
Var |
The name of the variable that will be assigned with the data from the socket. |
Bytes |
The number of bytes to read. |
|
|
Reading strings is not supported for UDP.
When you need to read a string you can use the OVERLAY option of DIM.
There will be no check on the length so specifying to receive 2 bytes for a byte will
© MCS Electronics, 1995-2007
overwrite the memory location after the memory location of the byte.
The socketstat function will return a length of the number of bytes + 8 for UDP. This because UDP sends also a 8 byte header. It contains the length of the data, the IP number of the peer and the port number.
The UDPread function will fill the following variables with this header data:
Peersize, PeerAddress, PeerPort
You need to DIM these variables in your program when you use UDP.
Use the following line :
Dim Peersize As Integer , Peeraddress As Long , Peerport As Word
Make sure you maintain the shown order.
See also
CONFIG TCPIP, GETSOCKET , SOCKETCONNECT, SOCKETSTAT , TCPWRITE, TCPWRITESTR, CLOSESOCKET , SOCKETLISTEN , UDPWRITE, UDPWRITESTR
Example
'----------------------------------------------------------------------------- |
|
------------ |
: udptest.bas |
'name |
'copyright |
: (c) 1995-2005, MCS Electronics |
'purpose |
: start the easytcp.exe program after the chip is |
programmed and |
press UDP button |
' |
'micro |
: Mega161 |
'suited for demo |
: no |
'commercial addon needed |
: yes |
'----------------------------------------------------------------------------- |
|
------------ |
|
$regfile = "m161def.dat" |
' specify the used |
micro |
' used crystal |
$crystal = 4000000 |
frequency |
' use baud rate |
$baud = 19200 |
$hwstack = 32 |
' default use 32 |
for the hardware stack |
' default use 10 |
$swstack = 10 |
for the SW stack |
' default use 40 |
$framesize = 40 |
for the frame space |
|
Const Sock_stream = $01 |
' Tcp |
Const Sock_dgram = $02 |
' Udp |
Const Sock_ipl_raw = $03 |
' Ip Layer Raw |
Sock |
' Mac Layer Raw |
Const Sock_macl_raw = $04 |
Sock |
' Confirm Socket |
Const Sel_control = 0 |
Status |
' Confirm Tx Free |
Const Sel_send = 1 |
Buffer Size |
' Confirm Rx Data |
Const Sel_recv = 2 |
|
page -702- |
© MCS Electronics, 1995-2007 |
|
Size |
|
'socket status |
' Status Of |
Const Sock_closed = $00 |
Connection Closed |
' Status Of Arp |
Const Sock_arp = $01 |
Const Sock_listen = $02 |
' Status Of |
Waiting For Tcp Connection Setup |
' Status Of |
Const Sock_synsent = $03 |
Setting Up Tcp Connection |
' Status Of |
Const Sock_synsent_ack = $04 |
Setting Up Tcp Connection |
' Status Of |
Const Sock_synrecv = $05 |
Setting Up Tcp Connection |
' Status Of Tcp |
Const Sock_established = $06 |
Connection Established |
' Status Of |
Const Sock_close_wait = $07 |
Closing Tcp Connection |
' Status Of |
Const Sock_last_ack = $08 |
Closing Tcp Connection |
' Status Of |
Const Sock_fin_wait1 = $09 |
Closing Tcp Connection |
' Status Of |
Const Sock_fin_wait2 = $0a |
Closing Tcp Connection |
' Status Of |
Const Sock_closing = $0b |
Closing Tcp Connection |
' Status Of |
Const Sock_time_wait = $0c |
Closing Tcp Connection |
' Status Of |
Const Sock_reset = $0d |
Closing Tcp Connection |
' Status Of Socket |
Const Sock_init = $0e |
Initialization |
' Status Of Udp |
Const Sock_udp = $0f |
Const Sock_raw = $10 |
' Status of IP RAW |
$lib "tcpip.lbx" |
' specify the |
tcpip library |
' display a |
Print "Init , set IP to 192.168.0.8" |
message |
' before we use |
Enable Interrupts |
config tcpip , we need to enable the interrupts |
|
Config Tcpip = Int0 , Mac = 12.128.12.34.56.78 , Ip = 192.168.0.8 , Submask = 255.255.255.0 , Gateway = 0.0.0.0 , Localport = 1000 , Tx = $55 , Rx = $55
'Use the line below if you have a gate way
'Config Tcpip = Int0 , Mac = 12.128.12.34.56.78 , Ip = 192.168.0.8 , Submask = 255.255.255.0 , Gateway = 192.168.0.1 , Localport = 1000 , Tx = $55 , Rx = $55
Dim Idx As Byte |
' socket number |
Dim Result As Word |
' result |
Dim S(80) As Byte |
|
Dim Sstr As String * 20 |
' temp bytes |
Dim Temp As Byte , Temp2 As Byte |
'----------------------------------------------------------------------------- |
|
--------------- |
|
'When you use UDP, you need to dimension the following variables in exactly the same order !
Dim Peersize As Integer , Peeraddress As Long , Peerport As Word
'----------------------------------------------------------------------------- |
|
--------------- |
' a handy function |
Declare Function Ipnum(ip As Long) As String |
'like with TCP, we need to get a socket first |
|
© MCS Electronics, 1995-2007
'note that for UDP we specify sock_dgram
Idx = Getsocket(idx , Sock_dgram , 5000 , 0) ' get socket for UDP mode, specify port 5000
Print "Socket " ; Idx ; " " ; Idx
'UDP is a connection less protocol which means that you can not listen, connect or can get the status
'You can just use send and receive the same way as for TCP/IP. 'But since there is no connection protocol, you need to specify the destination IP address and port
'So compare to TCP/IP you send exactly the same, but with the addition of the IP and PORT
Do
Temp = Inkey() |
' wait for |
|
terminal input |
' ESC pressed |
|
If Temp = 27 Then |
|
Sstr = "Hello" |
|
|
Result = Udpwritestr(192.168.0.3 , 5000 , Idx , Sstr , 255) |
|
End If |
' get number of |
Result = Socketstat(idx , Sel_recv) |
bytes waiting |
|
|
If Result > 0 Then |
|
|
Print "Bytes waiting : " ; Result |
'the first 8 bytes |
Temp2 = Result - 8 |
are always the UDP header which consist of the length, IP number and port |
|
address |
' read the result |
Temp = Udpread(idx , S(1) , Result) |
For Temp = 1 To Temp2 |
' print result |
|
Print S(temp) ; " " ; |
|
Next |
|
|
Print |
' these are |
|
Print Peersize ; " " ; Peeraddress ; " " ; Peerport |
|
assigned when you use UDPREAD |
' print IP in |
|
Print Ipnum(peeraddress) |
|
usual format |
|
' |
Result = Udpwrite(192.168.0.3 , Peerport , Idx , S(1) , Temp2) |
write the received data back |
|
|
End If |
|
|
Loop |
|
|
'the sample above waits for data and send the data back for that reason temp2 is subtracted with 8, the header size
'this function can be used to display an IP number in normal format
Function Ipnum(ip As Long) As String
Local T As Byte , J As Byte
Ipnum = ""
For J = 1 To 4 T = Ip And 255
Ipnum = Ipnum + Str(t)
If J < 4 Then Ipnum = Ipnum + "."
Shift Ip , Right , 8
Next
End Function End
UDPWRITE
Action
Write UDP data to a socket.