C# Последовательный порт консоли Чтение потери данных - PullRequest
0 голосов
/ 08 мая 2020

Я попытался запустить последовательную связь, используя C# из примера Microsoft https://docs.microsoft.com/en-us/dotnet/api/system.io.ports.serialport?view=dotnet-plat-ext-3.1. и я подключаюсь к модулю Bluetooth H C -06, который подключен к плате Arduino Nano.

Проблема в том, что при запуске на моем ноутбуке, кажется, теряется много данных, я не уверен, что вызывает эту проблему. Однако, когда я запускаю его на своем рабочем столе, кажется, что все работает нормально. На настольном компьютере теряется только 1 или 2 данных на 200 выборок в секунду, а на ноутбуке - около 50 ~ 70 выборок. (Я уверен, что это не является причиной того, что Arduino Part из моего эксперимента снова и снова на рабочем столе получает данные около 200 выборок в секунду, как упоминалось выше).

Может ли это быть вызвано моим процессором? * Процессор ноутбука: Core-I7-6700 * Настольный процессор: Core-i7-7700

(я добавляю несколько кодов к исходным кодам записи данных в текстовый файл) Вот C# коды консоли:

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

public class PortChat
{
    static bool _continue;
    static SerialPort _serialPort;
    static String myPath;
    public static void Main()
    {
        string name;
        string message;
        StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
        Thread readThread = new Thread(Read);

        myPath = Mypath();
        // Create a new SerialPort object with default settings.
        _serialPort = new SerialPort();

        // Allow the user to set the appropriate properties.
        _serialPort.PortName = SetPortName(_serialPort.PortName);
        _serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate);
        _serialPort.Parity = SetPortParity(_serialPort.Parity);
        _serialPort.DataBits = SetPortDataBits(_serialPort.DataBits);
        _serialPort.StopBits = SetPortStopBits(_serialPort.StopBits);
        _serialPort.Handshake = SetPortHandshake(_serialPort.Handshake);

        // Set the read/write timeouts
        _serialPort.ReadTimeout = 500;
        _serialPort.WriteTimeout = 500;

        _serialPort.Open();
        _continue = true;
        readThread.Start();

        Console.Write("Name: ");
        name = Console.ReadLine();

        Console.WriteLine("Type QUIT to exit");

        while (_continue)
        {
            message = Console.ReadLine();

            if (stringComparer.Equals("quit", message))
            {
                _continue = false;
            }
            else
            {
                _serialPort.WriteLine(
                    String.Format("<{0}>: {1}", name, message));
            }
        }

        readThread.Join();
        _serialPort.Close();
    }

    public static void Read()
    {
        while (_continue)
        {
            try
            {
                string time = DateTime.Now.ToString("h:mm:ss.ffffff");
                string message = _serialPort.ReadLine();
                string data = time + "," + message.Trim();
                Console.WriteLine(data);
                WriteFile(Path, data);
            }
            catch (TimeoutException) { }
        }
    }

    public static String Mypath()
    {
        string Path;
        Console.WriteLine("-> Logging Data <-");
        Console.Write("-> Input File Name: ");
        Path = Console.ReadLine();

        if(Path == "")
        {
            Path = DateTime.Now.ToString("h:mm:ss.ffffff");
        }

        return Path + ".txt";
    }

    static void WriteFile(String Path, String Data)
    {
        if (!File.Exists(Path))
        {
            using (StreamWriter sw = File.CreateText(Path))
            {
                sw.WriteLine(Data);
            }
        }
        using (StreamWriter sw = File.AppendText(Path))
        {
            sw.WriteLine(Data);
        }
    }

    // Display Port values and prompt user to enter a port.
    public static string SetPortName(string defaultPortName)
    {
        string portName;

        Console.WriteLine("Available Ports:");
        foreach (string s in SerialPort.GetPortNames())
        {
            Console.WriteLine("   {0}", s);
        }

        Console.Write("Enter COM port value (Default: {0}): ", defaultPortName);
        portName = Console.ReadLine();

        if (portName == "" || !(portName.ToLower()).StartsWith("com"))
        {
            portName = defaultPortName;
        }
        return portName;
    }
    // Display BaudRate values and prompt user to enter a value.
    public static int SetPortBaudRate(int defaultPortBaudRate)
    {
        string baudRate;

        Console.Write("Baud Rate(default:{0}): ", defaultPortBaudRate);
        baudRate = Console.ReadLine();

        if (baudRate == "")
        {
            baudRate = defaultPortBaudRate.ToString();
        }

        return int.Parse(baudRate);
    }

    // Display PortParity values and prompt user to enter a value.
    public static Parity SetPortParity(Parity defaultPortParity)
    {
        string parity;

        Console.WriteLine("Available Parity options:");
        foreach (string s in Enum.GetNames(typeof(Parity)))
        {
            Console.WriteLine("   {0}", s);
        }

        Console.Write("Enter Parity value (Default: {0}):", defaultPortParity.ToString(), true);
        parity = Console.ReadLine();

        if (parity == "")
        {
            parity = defaultPortParity.ToString();
        }

        return (Parity)Enum.Parse(typeof(Parity), parity, true);
    }
    // Display DataBits values and prompt user to enter a value.
    public static int SetPortDataBits(int defaultPortDataBits)
    {
        string dataBits;

        Console.Write("Enter DataBits value (Default: {0}): ", defaultPortDataBits);
        dataBits = Console.ReadLine();

        if (dataBits == "")
        {
            dataBits = defaultPortDataBits.ToString();
        }

        return int.Parse(dataBits.ToUpperInvariant());
    }

    // Display StopBits values and prompt user to enter a value.
    public static StopBits SetPortStopBits(StopBits defaultPortStopBits)
    {
        string stopBits;

        Console.WriteLine("Available StopBits options:");
        foreach (string s in Enum.GetNames(typeof(StopBits)))
        {
            Console.WriteLine("   {0}", s);
        }

        Console.Write("Enter StopBits value (None is not supported and \n" +
         "raises an ArgumentOutOfRangeException. \n (Default: {0}):", defaultPortStopBits.ToString());
        stopBits = Console.ReadLine();

        if (stopBits == "" )
        {
            stopBits = defaultPortStopBits.ToString();
        }

        return (StopBits)Enum.Parse(typeof(StopBits), stopBits, true);
    }
    public static Handshake SetPortHandshake(Handshake defaultPortHandshake)
    {
        string handshake;

        Console.WriteLine("Available Handshake options:");
        foreach (string s in Enum.GetNames(typeof(Handshake)))
        {
            Console.WriteLine("   {0}", s);
        }

        Console.Write("Enter Handshake value (Default: {0}):", defaultPortHandshake.ToString());
        handshake = Console.ReadLine();

        if (handshake == "")
        {
            handshake = defaultPortHandshake.ToString();
        }

        return (Handshake)Enum.Parse(typeof(Handshake), handshake, true);
    }
}

и вот коды Arduino:

#include <TimerOne.h>
#include <SoftwareSerial.h>
SoftwareSerial HC06(2, 3);

void setup() {
HC06.begin(115200);
Timer1.initialize(5000); // micro second
Timer1.attachInterrupt(printout);
Timer1.start();
}

void printout()
{
  HC06.println(data());
}

String data()
{
  int d1 = analogRead(A0);
  int d2 = analogRead(A1);
  String d = String(d1) +","+ String(d2);
  return d;  
}

void loop() 
{

}

1 Ответ

0 голосов
/ 08 мая 2020

вы пробовали использовать более низкий битрейт, скажем 9600? Возможно, эта высокая скорость не работает с Arduino.

...