Чтение из последовательного порта в C#

var nums = 1.12346;
var dec = 10E3;
var intnums = Math.floor(nums * dec);
var trim = intnums / dec;
console.log(trim);

12
задан sarsnake 16 March 2009 в 20:52
поделиться

2 ответа

Вы попытались слушать DataRecieved событие SerialPort класс?

public class MySerialReader : IDisposable
{
    private SerialPort serialPort;
    private Queue<byte> recievedData = new Queue<byte>();

    public MySerialReader()
    {
        serialPort = new SerialPort();
        serialPort.Open();

        serialPort.DataReceived += serialPort_DataReceived;
    }

    void serialPort_DataReceived(object s, SerialDataReceivedEventArgs e)
    {
        byte[] data = new byte[serialPort.BytesToRead];
        serialPort.Read(data, 0, data.Length);

        data.ToList().ForEach(b => recievedData.Enqueue(b));

        processData();
    }

    void processData()
    {
        // Determine if we have a "packet" in the queue
        if (recievedData.Count > 50)
        {
            var packet = Enumerable.Range(0, 50).Select(i => recievedData.Dequeue());
        }
    }

    public void Dispose()
    {
        if (serialPort != null)
            serialPort.Dispose();
    }
22
ответ дан 2 December 2019 в 04:17
поделиться

Мы прошли тот же процесс только что.

Единственный способ считать 'пакеты' состоит в том, чтобы иметь некоторое понятие того, где запуск и конец их находятся в потоке.

Из MSDN:

Поскольку класс SerialPort буферизует данные, и поток, содержавшийся в свойстве BaseStream, не делает, эти два могли бы конфликтовать о том, сколько байтов доступно в чтение. Свойство BytesToRead может указать, что существуют байты для чтения, но эти байты не могли бы быть доступны для потока, содержавшегося в свойстве BaseStream, потому что они были буферизованы к классу SerialPort.

Мы использовали поток backround (Вы могли использовать BackgroundWorker) считывать данные в буфер. Если Вы не можете надежно установить оконечный знак с помощью SerialPort. Свойство Newline (потому что, скажем, это варьируется!) затем необходимо будет реализовать собственную пакетную систему обнаружения потому что Вы привычка смочь использовать блокирующийся SerialPort. Readline () метод.

Вы могли просто считать в буфер байта использование SerialPort. Read () (или строка с помощью SerialPort. ReadExisting () метод), и генерируют событие, когда Вы обнаруживаете допустимый пакет в данных. Обратите внимание, что Read () (и я принимаю ReadExisting ()) освобождает буфер SerialPort, таким образом, необходимо будет сохранить данные где-то в другом месте.

Если Вы устанавливаете SerialPort. ReadTimeout, можно обработать TimeoutException и иметь простой способ обработать условия, куда устройство не передает. Это - хороший способ сбросить Ваше пакетное обнаружение при использовании постоянного числа байтов или некоторой другой незавершенной схемы. (используйте SerialPort. DiscardInBuffer () на тайм-ауте, если Вам не нужны частичные пакеты).

Удачи

10
ответ дан 2 December 2019 в 04:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: