Я новичок в Linux и хочу перенести этот фрагмент кода C #:

using System;
using System.IO;
using System.IO.Ports;

public class LoadCell
{
    private static string configFile = Directory.GetCurrentDirectory() + "\\LoadCell.config";
    private static string errorLog = Directory.GetCurrentDirectory() + "\\LoadCell.log";
    private static string puerto = "COM1";

    public static void Main (string[] args)
    {
        if(File.Exists(configFile))
        {
            TextReader tr = new StreamReader(configFile);
            puerto = tr.ReadToEnd();
            tr.Close();
        }

        if(args.Length > 0)
        {
            switch(args[0])
            {
                case "-ayuda":
                    Console.WriteLine("\r\nEste programa esta diseñado para capturar el peso medido actualmente por la báscula a través de un puerto (por defecto es el COM1). Recuerde que el indicador debe estar configurado para:");
                    Console.WriteLine("\r\npuerto: " + puerto);
                    Console.WriteLine("baud rate: 4800");
                    Console.WriteLine("parity: none");
                    Console.WriteLine("data bits: 8");
                    Console.WriteLine("stop bit: one");
                    Console.WriteLine("\r\nEn caso de ocurrir un error recuerde revisar el log de errores (" + errorLog + ").");
                    Console.WriteLine("\r\nLos posibles argumentos son:");
                    Console.WriteLine("\r\n-ayuda: este ya lo sabes usar...");
                    Console.WriteLine("\r\n-puerto <nombre>: cambia el puerto al nuevo valor creando un archivo de configuración (" + configFile + ")");
                    Console.WriteLine("\r\n-default: elimina el archivo de configuración para retomar la configuración inicial");
                    break;

                case "-default":
                    File.Delete(configFile);
                    Console.WriteLine("\r\narchivo de configuración eliminado");
                    break;

                case "-puerto":
                    if(args.Length > 1)
                    {
                        puerto = args[1];
                        TextWriter tw = new StreamWriter(configFile);
                        tw.Write(puerto);
                        tw.Close();
                        Console.WriteLine("\r\npuerto cambiado a " + puerto);
                    }
                    else
                    {
                        Console.WriteLine("\r\nse esperaba un nombre de puerto");
                    }
                    break;
            }
        }
        else
        {
            new LoadCell();
        }
    }

    private static void log(string text)
    {
        Console.Write("ha ocurrido un error...");
        TextWriter sw = File.AppendText(errorLog);
        sw.WriteLine("[" + System.DateTime.Now.ToString() + "] " + text);
        sw.Close();
    }

    public LoadCell()
    {
        try
        {
            SerialPort port = new SerialPort(puerto, 4800, Parity.None, 8,  StopBits.One);
            port.NewLine = "\r";
            port.ReadTimeout = 10000;
            port.Open();
            port.WriteLine("RA:");
            port.DiscardInBuffer();
            Console.Write(port.ReadLine());
        }
        catch(Exception e)
        {
            log("Error: " + e.ToString());
        }
    }
}

К чему-то другому, любое предложение будет оценено!

Кстати, что вы думаете о том, чтобы сделать это непосредственно в PHP? Потому что результат используется в файле PHP, например:

function peso() {

    $resultado = utf8_encode(exec('loadcell'));

    if(preg_match('/^RA:\s*([0-9]{1,8})$/i', $resultado, $m) > 0) {

        json_exit(array('peso' => $m[1]));

    } else {

        json_exit(array('error' => $resultado));

    }

}

Благодарность!

0
coma 10 Июн 2009 в 10:18

5 ответов

Лучший ответ

Помните, что Linux использует косую черту для путей, в то время как Windows использует обратную косую черту, поэтому вам нужно сделать что-то вроде:

private static string configFile = Path.Combine(Directory.GetCurrentDirectory(), "LoadCell.config");
// Or...
private static string configFile = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "LoadCell.config";

Кроме того, что не работает при компиляции в моно?

Кроме того, запустите приложение через MoMA.

4
si618 1 Дек 2014 в 23:30

Я понимаю, что это не отвечает на ваш вопрос, но если этот php-скрипт вызывается из Интернета, вам понадобится какая-то блокировка, чтобы два разных HTTP-запроса не пытались одновременно открыть последовательный порт.

Посмотрите, можете ли вы реализовать какое-то кеширование (если возможно), чтобы ваш сценарий мог предоставить старое значение, а не сообщение об ошибке, если последовательный порт в противном случае занят.

1
Michiel Buddingh 10 Июн 2009 в 06:55

Если вы хотите использовать последовательный порт с Mono в Linux, убедитесь, что ваша версия обновлена. Если ваша версия слишком старая, вы можете столкнуться с этой ошибкой
Я думаю, что это было исправлено в версии> 1.9, но я знаю, что это все еще было в версии 1.9.1

Если ваше приложение не выполняет много операций записи в последовательный порт, все должно быть в порядке, в противном случае вы можете попробовать это временное решение

1
Community 23 Май 2017 в 11:48

Я не совсем уверен, в чем проблема, но если вы все равно используете его в PHP, конечно, перенесите код на PHP. Поскольку PHP работает на любой машине, на которой может быть запущен сервер с поддержкой PHP, при таком подходе вы практически не зависите от платформ.

0
Michael Klement 10 Июн 2009 в 06:28

Вы пробовали просто использовать C #? Проект Mono предоставляет кроссплатформенный порт .NET Framework с открытым исходным кодом. Таким образом, вы можете избежать необходимости переписывать свой код (который предположительно уже работает и протестирован).

0
Jimmy 10 Июн 2009 в 06:28