Я попытался запустить последовательную связь, используя 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()
{
}