查看 8 帖子 - 1 通过 8 (的 25 总)
  • 作者
    帖子
  • #24424
    cpiga
    参加者

    Avete idea se sia possibile acquisire l’input di un sismografo theremino a 3 canale su Matlab? Non riesco a trovare esempi di codice per capire come iniziare ad affrintare il problema.
    Grazie anticipatamente a chiunque mi voglia dare una mano.
    问候
    Carlo

    #24426
    theremino
    钥匙大师

    Tutte le applicazioni thereminiche scrivono i valori negli Slot, quindi anche il sismografo lo fa.
    Gli Slot sono valori Float (4 字节) nel file mappato in memoria che si chiama “Theremino1”
    一世 “Memory mapped file” sono file del sistema Windows e tutte le loro particolarità sono ben spiegate da Microsoft.

    Per cui a questo punto il problema non è tanto nostro (del sistema theremino) ma di Mathlab.
    Se MathLab può leggere i MemoryMappedFile di Windows allora sei a posto.
    Se non li può leggere allora noi non possiamo fare nulla per aiutarlo.

    Mi spiace ma non so dirti altro su MathLab, noi utilizziamo solo applicazioni OpenSource e MathLab non lo è.

    #24428
    cpiga
    参加者

    Matlab supporta i MemoryMappedFile.
    I valori float come sono ordinati nel file? Sequenzialmente dallo slot 1 上? Potrei scrivere una serie di funzioni (da condividere) per rendere più pulito e ordinato il lavoro…
    好, Matlab non è opensource ma esistono cloni opensource che possono condividere il codice (octave).
    Quindi se ho capito bene.
    Leggo i primi 4byte del mapped file ed ho il segnale sullo slot1.
    Leggo i secondi 4 byte del mapped file ed ho il segnale sullo slot 2.
    Leggo i terzi 4 byte del mapped file ed ho il segnale sullo slot 3,
    Grazie mille per il sostegno.
    再见
    Carlo

    #24430
    cpiga
    参加者

    Un’altra cosa… ma il file “theremino1” dove lo trovo nel file system?

    #24432
    cpiga
    参加者

    Mi sembra di aver capito che “Theremino1” sia un non-persistent memory mapped file. Quindi non corrisponde ad uno specifico file nel file system. Matlab invece supporta solo i persistent memory mapped file. Quindi l’unica soluzione che mi viene in mente è scrivere un piccolo software in c# che acceda al non-persistent memory mapped file e lo copi su un persistent memory mapped file sul file sytem in un loop infinito a cui accede Matlab.
    Altri suggerimenti su altre, più eleganti, soluzioni sono graditi…
    大家好

    #24434
    cpiga
    参加者

    Ho scritto questo ma non sembra funzionare:

    using System;
    using System.IO;
    using System.IO.MemoryMappedFiles;
    using System.Threading;
    
    class Program
    {
        // Process B:
        static void Main(string[] args)
        {
            try
            {
                using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("Theremino1"))
                {
                    var mmf_persistent = MemoryMappedFile.CreateFromFile(@"Theremino1_persist", FileMode.Open);
                    while (true)
                    {
                        mmf_persistent = mmf;
                     }   
                }
            }
            catch (FileNotFoundException)
            {
                Console.WriteLine("Memory-mapped file does not exist. Run HAL first.");
            }
        }
    }

    Qualche suggerimento per metterlo apposto?

    • 该回复被修改 3 年份, 11 个月 前 通过 cpiga.
    • 该回复被修改 3 年份, 11 个月 前 通过 cpiga.
    #24437
    cpiga
    参加者

    Questa un’altra versione:

    using System;
    using System.IO;
    using System.IO.MemoryMappedFiles;
    using System.Threading;
    
    class Program
    {
        // Process B:
        static void Main(string[] args)
        {
            try
            {
                using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("Theremino1"))
                {
                    var mmf_persistent = MemoryMappedFile.CreateFromFile(@"Theremino1_persist", FileMode.Open, "Thermino1_persist");
                    byte[] buffer = new byte[4000];
                    int bytesRead;
                    using (MemoryMappedViewStream stream_persist = mmf.CreateViewStream())
                    {
                        BinaryWriter writer = new BinaryWriter(stream_persist);
                        using (MemoryMappedViewStream stream = mmf_persistent.CreateViewStream())
                        {
                            BinaryReader reader = new BinaryReader(stream);
                            while (true)
                            {
                                bytesRead = reader.Read(buffer, 0, buffer.Length);
                                writer.Write(buffer, 0, bytesRead);
                            }
    
                        }
    
                    }
    
      
                }
            }
            catch (FileNotFoundException)
            {
                Console.WriteLine("Memory-mapped file does not exist. Run HAL first.");
            }
        }
    }

    Ma Matlab vede sempre e solo il contenuto del file di zeri che ho scritto sul file system….

    #24439
    theremino
    钥匙大师

    Sul nostro sito abbiamo pubblicato molti esempi di lettura e scrittura dei MemoryMappedFile in vari linguaggi tra cui anche il C++

    Li trovi qui:
    https://www.theremino.com/downloads/foundations#easyslot

    E anche qui:
    https://www.theremino.com/downloads/foundations#mmf

    Ma c’è anche un’altra cosa che devi considerare:
    1) I MemoryMappedFile cui accedono le app a 32 bit non sono gli stessi a cui accedono la app s 64 位 (casini di Windows e di SysWow64 ecc…)
    2) Noi dobbiamo fare tutte le nostre applicazioni a 32 bit altrimenti dovremmo darle in due versioni, ma peggio ancora nessuno con i tablet e i mini pc potrebbe usarle.
    3) Di conseguenza la tua app devi compilarla a 32 bit altrimenti non vede i MMF giusti, se li crea lei al volo e legge solo zeri.

查看 8 帖子 - 1 通过 8 (的 25 总)
  • 您必须登录才能回复这个主题.