Сегодня столкнулся с подобной проблемой, только весы возвращали 239 ошибку. Заглянул в fileStructure.
Обратил внимание на длину передаваемой записи(19 байт): PRESET KEY ASSIGNMENT FILE (41H) (19B/45B/46B)
Подкоректировал метод в драйвере весов, отвечающий за отправку привязок к кнопкам. Передаваемую длину установил в 19 байт и неиспользуемые последние 8 байт заполнил нулями. В итоге все заработало.
Вывод: требуется точное соблюдение длины передаваемых записей и во избежание передачи мусора, обязательно нужно пустоты заполнять нулями
#define DIGI_CMDSIZE_PRESETKEY 19
#define DIGI_CMD_SETPRESETKEY 0xF141
/*------------------------------------------------------------------------
Procedure: scaleSetPresetKey
Purpose: load preset keys
PRESET KEY ASSIGNMENT FILE (41H) (19B/45B/46B)
PRESET NUMBER - 4 BYTES (BCD)
PRESET RECORD SIZE - 2 BYTES (HEX)
PRESET KEY SWITCH # - 4 BYTES
PRESET STATUS - 1 BYTE
------------------------------------------------------------------------*/
int __declspec(dllexport) scaleSetPresetKey(int _sock, struct PresetKey * pk){
char *buf;
int pos = 0;
struct scaleAnswer res;
if (!(buf = (char *)calloc(DIGI_CMDSIZE_PRESETKEY+2, sizeof(char)))) return ERR_MEMALLOC;
pos += _s2(buf + pos, DIGI_CMD_SETPRESETKEY);
pos += _s4(buf + pos, IntToBCD(pk->number));
pos += _s2(buf + pos, 0x13);//передаем длину структуры PRESET RECORD SIZE = 19В
pos += _s4(buf + pos, IntToBCD(pk->keySwitch));
buf[pos++] = 0;
memset(buf+pos, 0, 0x8);//дополняем нулями 8 байт, добивая до 19В
pos += 8;
res = scaleSendCommand(_sock, buf, pos);
free(buf);
return res.errorCode;
}