LINUX.ORG.RU

Запись данных из файла в файл

 , ,


0

1

Здравствуйте!

Есть файл с пробным пакетом modbus rtu. Пакет лежит в hex формате Подскажите, пожалуйста как мне из файла mr.bin записать данные в файл канала лежащий /tmp/rs485 и вывести на экран через hexdump

Пытаюсь так, но не работает

cat mr.bin | hexdump -C | tee /tmp/rs485

файл с пробным пакетом
в hex формате
записать данные в файл канала
вывести на экран через hexdump

понормальному объясни

armbox ()

Пакет лежит в hex формате

Подскажите, пожалуйста, что это за формат?

может нужно было просто поменять команды местами?

cat mr.bin | tee /tmp/rs485 | hexdump -C

anonymous ()
Ответ на: комментарий от armbox

Короче. Есть файл mr.bin. Как его содержимое вывести на экран и одновременно записать в файл rs485.

В mr.bin числа в hex виде

Paralam ()
Ответ на: комментарий от Paralam

В mr.bin числа в hex виде

00000000: 001122

и

00 11 22
оба варианта hex вид, пример приведи уже.

anonymous ()

Пытаюсь так, но не работает
cat mr.bin | hexdump -C | tee /tmp/rs485

Что именно не работает? Команда правильная. Или, скажем так, валидная - в зависимости от того, что тебе на самом деле надо.

Deleted ()
#!/usr/bin/python3

import struct

POLYNOMIAL = 0xA001

def crc(packet):
    crc = 0xffff
    #do{
    for ch in packet:
    #   /* Exclusive-OR the byte with the CRC */
    #   crc ^= (unsigned int)*char_ptr;
        crc = crc ^ (ch & 0x00ff)
    #   /* Loop through all 8 data bits */
    #   bit_count = 0;
    #   do{
        for i in range(8):
    #       /* If the LSB is 1, shift the CRC and XOR the polynomial mask with the CRC */
    #       if(crc & 0x0001){
            if (crc & 1) != 0:
    #           crc >>= 1;
                crc = crc >> 1
    #           crc ^= POLYNOMIAL;
                crc = crc ^ POLYNOMIAL
    #       }
    #       /* If the LSB is 0, shift the CRC only */
    #       else {
            else:
    #          crc >>= 1;
                crc = crc >> 1
    #      }
    #   } while(bit_count++ < 7);
    #} while(char_ptr++ < end_of_packet);
    crcl = (crc >> 0) & 0xff
    crch = (crc >> 8) & 0xff
    return packet + bytes([crcl, crch])

def fc_01(adr, start, quantity):
    return crc(struct.pack('>BBHH', adr, 1, start, quantity))

packet = fc_01(5, 0x0100, 8)

print('send: %s' % ['%02x' % x for x in packet])

rs = open('/tmp/rs485', 'wb')
rs.write(packet)
rs.flush()
rs.close()
anonymous ()
Ответ на: комментарий от Deleted

Так у него там уже hex-представление со смещениями и всем прочим, я так понимаю, ему нужно сконвертировать это в бинарное представление и скормить устройству. https://ru.wikipedia.org/wiki/Intel_HEX

wakuwaku ★★★★ ()
Ответ на: комментарий от wakuwaku

Ты то откуда знаешь, этим НЕХ-ом называют кого попало. И зачем ему (новичку)

cat, новичкам, помощь

понадобилось в Intel HEX формате записывать «пробный пакет».

Есть файл с пробным пакетом modbus rtu.

Ему ведь надо контрольную сумму самого пакета посчитать, а затем ещё в HEX. Думаешь он совсем не от мира сего?

anonymous ()
Ответ на: комментарий от anonymous

08 03 00 00 00 0f 57 39

Если сделать просто cat mr.bin, то числа выводится не будут.

Поэтому делал вывод так cat mr.bin | hexdump -C

После этого понадобилось записывать это добро в бесконечном цикле в файл фифо канала rs485. Заодно хочется видеть консоли каждый раз при записи эти данные

Вот и попробовал команду

Cat mr.bin | hexdump -C | tee /tmp/rs485

Но в файл ничего не пишется.

Знакомый посоветовал из cat перенаправление > делать на tee, а из tee уже распределять в файл и в hexdump

Но как сделать не пойму.

Попробую

Cat mr.bin | tee /tmp/rs485 | hexdump -C

Paralam ()
Ответ на: комментарий от anonymous

Я помню себя 15 лет назад («привет, интернет, пора узнать, как оно работает»), для меня не было проблемой различать бинарные данные и hex-представление. Хотя твоя правда, кто его знает.

wakuwaku ★★★★ ()
Последнее исправление: wakuwaku (всего исправлений: 1)
Ответ на: комментарий от Paralam

у тебя вполне грамотный знакомый

anonymous ()
Ответ на: комментарий от anonymous

Да все у меня считается в сишном файле.

Я не могу пакет-запрос от мастера из файла mr.bin засунуть в фифо канал, откуда у меня читает сишная функция

Paralam ()
Ответ на: комментарий от Paralam

угу, а она совсем не читает ничего?

anonymous ()
Ответ на: комментарий от Paralam

да, и это уже 3-тий повтор, причем два раза от тебя

anonymous ()
Ответ на: комментарий от Paralam

держи, играйся

#!/bin/bash

rm -f rs485 a.out

mkfifo rs485

gcc -x c - <<EOF
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>

#define MAX_BUF 10

int main()
{
    int fd;
    char * myfifo = "rs485";
    char buf[MAX_BUF];

    /* open, read, and display the message from the FIFO */
    fd = open(myfifo, O_RDONLY);
    read(fd, buf, MAX_BUF);
    printf("Received: %s\n", buf);
    close(fd);

    return 0;
}
EOF

./a.out &

python3 -- <<EOF
import struct

POLYNOMIAL = 0xA001

def crc(packet):
    crc = 0xffff
    for ch in packet:
        crc = crc ^ (ch & 0x00ff)
        for i in range(8):
            if (crc & 1) != 0:
                crc = crc >> 1
                crc = crc ^ POLYNOMIAL
            else:
                crc = crc >> 1
    crcl = (crc >> 0) & 0xff
    crch = (crc >> 8) & 0xff
    return packet + bytes([crcl, crch])

def fc_01(adr, start, quantity):
    return crc(struct.pack('>BBHH', adr, 1, start, quantity))

packet = fc_01(5, 0x0100, 8)

print('send: %s' % ['%02x' % x for x in packet])

rs = open('rs485', 'wb')
rs.write(packet)
rs.flush()
rs.close()
EOF

anonymous ()
Ответ на: комментарий от Paralam

да, и если в приведенном выше скрипте исправить строчку:

rs = open('rs485', 'wb')
на
rs = open('mr.bin', 'wb')
и в конце скрипта дописать:
cat mr.bin | tee rs485 | hexdump -C
то получится пример с кошкой и тройником

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.