Доработка. Подсчёт контрольной сумму согласован с Тулой, разработчиками СПТ-25

This commit is contained in:
sasha80
2025-09-02 14:24:42 +03:00
parent 519e3ce093
commit 6fc6be666c
2 changed files with 51 additions and 32 deletions

View File

@@ -11,40 +11,63 @@ var tick: int = 0
class SocketSerial extends SerialPort:
const P_DIV: = 0x8408
const FLAG: = 0x7e
const FLAG_MASK: = 0x20
const FSC_MASK: = 0x8000
const parity_code = {
'N': SerialPort.PARITY_NONE,
'E': SerialPort.PARITY_EVEN,
'O': SerialPort.PARITY_ODD }
var tx_buffer: PackedByteArray
func _init() -> void:
tx_buffer.resize(256)
func send_to(data: PackedByteArray):
tools.allways(data.size() >= 3, 'длина буфера меньше необходимого')
var i_sum: = data.size() - 3
data.encode_u16(i_sum, 0)
tx_buffer[0] = 0x7e
var i: = 1
for v in data:
if v != 0x7e:
tx_buffer[i] = v
i += 1
else:
tx_buffer[i] = FLAG
i += 1
tx_buffer[i] = FLAG ^ FLAG_MASK
i += 1
var v_sum: = get_check_sum(data)
data.encode_u16(i_sum, v_sum)
write_raw(data)
tx_buffer.encode_u16(i, v_sum)
i += 2
tx_buffer[i] = FLAG
i += 1
write_raw(tx_buffer.slice(0, i))
func _to_string() -> String: return 'последовательный порт \"%s\" @ %d (%s)' % [self.port, self.baudrate, 'открыт' if is_open() else 'закрыт']
func get_check_sum(src: PackedByteArray) -> int:
var P_DIV: = 0xf0b8
var FCS = ~((src[2]<<8) + src[1])
for i in range(3, src.size()):
var C = src[i]
for j in 8:
if C & 1:
if FCS & 1:
FCS = ((FCS >> 1) | 0x8000) ^ P_DIV
var fsc: = ~((src[1]<<8) + src[0])
for i: int in range(2, src.size()):
var chr: = src[i]
for j: int in 8:
if chr & 1:
if fsc & 1:
fsc = ((fsc >> 1) | FSC_MASK) ^ P_DIV
else:
FCS = ((FCS >> 1) | 0x8000)
fsc = ((fsc >> 1) | FSC_MASK)
else:
if FCS & 1:
FCS = (FCS >> 1) ^ P_DIV
if fsc & 1:
fsc = (fsc >> 1) ^ P_DIV
else:
FCS = FCS >> 1
C >>= 1
for j in 16:
if FCS & 1:
FCS = (FCS >> 1) ^ P_DIV
fsc = fsc >> 1
chr >>= 1
for j: int in 16:
if fsc & 1:
fsc = (fsc >> 1) ^ P_DIV
else:
FCS = FCS >> 1
return ~FCS
fsc = fsc >> 1
return ~fsc
func try_open(parsing_proc: Callable):
if is_open():

View File

@@ -15,16 +15,12 @@ class SPT25 extends unit.Unit:
func _init(nm) -> void:
self.name = nm
tx_data.resize(9)
tx_data[0] = 0x7e # Флаги синхронизации пакета
tx_data[1] = 0 # Адрес абонента, которому предназначен пакет
tx_data[2] = CmdCode.INFO # Тип пакета, КОД КОМАНДЫ - Получить информацию о состоянии преобразователя
tx_data.resize(5)
tx_data[0] = 0 # Адрес абонента, которому предназначен пакет
tx_data[1] = CmdCode.INFO # Тип пакета, КОД КОМАНДЫ - Получить информацию о состоянии преобразователя
tx_data[2] = 0 # Данные
tx_data[3] = 0 # Данные
tx_data[4] = 0 # Данные
tx_data[5] = 0 # Данные
tx_data[6] = 0 # Контрольная сумма мл. байт
tx_data[7] = 0 # Контрольная сумма ст. байт
tx_data[8] = 0x7e # Флаги синхронизации пакета
func parse(rx_data: PackedByteArray, tick: int):