'Cálculo del CRC
'NOTA: Aunque el CRC es un INTEGER, se trabaja con LONG, con el fin de poder tratar el bit de
'más peso de un entero (el de signo) sin problemas. BASIC no maneja números sin signo.
Function CRC16( Datos As String ) As Long
Dim flag
Dim crc
Dim car
Dim bit
crc = &hFFFF&
For car = 1 To Len( Datos )
crc = crc Xor Asc(Mid$( Datos, car, 1 ))
For bit = 0 To 7
Next bit
Next car
CRC16 = crc
End Function
'Enviar datos al Área de Escritura
'
nDIS = Número de dispositivo, add = Dirección inicial de escritura
'
cant = Cantidad de palabras a escribir, datos = Datos, en binario, a escribir
'Retorna los datos recibidos vía serie
Function Enviar(nDIS As Integer, add As Integer, cant As Integer, datos As String) As String
Dim nbytes
Dim balto
Dim bbajo
Dim crcAs Long
Dim env
Dim TBytes() As Byte 'Igual que «env»
Dim b
'Mensaje a enviar
env = Chr$( nDIS ) & Chr$( 16 )
env = env & Chr$(0) & Chr$( add )
env = env & Chr$(0) & Chr$( cant )
env = env & Chr$(cant * 2)
env = env & datos
nbytes = 8
'Añadir el CRC al mensaje
crc = CRC16(env)
balto = CInt((( crc And &HFF00& ) \ &H100& ) And &HFF& )
bbajo = CInt( crc And &HFF& )
env = env & Chr$( bbajo )
env = env & Chr$( balto )
As Long
As Long
As Integer
As Integer
flag = crc And &h1&
crc = crc \ 2&
If flag = 1& Then crc = crc Xor &hA001&
'Bytes a retornar el dispositivo
As Integer
As Integer
'Byte alto del CRC
As Integer
'Byte bajo del CRC
'Valor de CRC
As String
'Datos a enviar
'Índice
As Integer
'nº de bytes
'Calcular el CRC
'cabecera
'dirección inicial
'cantidad de palabras
17