Дело в том, что я написал эту программу для отправки данных с моего компьютера в arduino:
using System.IO.Ports;
using System.Threading;
using System.Diagnostics;
using System.Runtime.InteropServices;
using OpenHardwareMonitor.Hardware;
namespace ArduinoDetector
{
class Program
{
private static PerformanceCounter cpu;
private static PerformanceCounter ram;
private static SerialPort port;
private static float totalRam;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
private class MEMORYSTATUSEX
{
public uint dwLength;
public uint dwMemoryLoad;
public ulong ullTotalPhys;
public ulong ullAvailPhys;
public ulong ullTotalPageFile;
public ulong ullAvailPageFile;
public ulong ullTotalVirtual;
public ulong ullAvailVirtual;
public ulong ullAvailExtendedVirtual;
public MEMORYSTATUSEX()
{
dwLength = (uint)Marshal.SizeOf(this);
}
}
private class Visitor : IVisitor
{
public void VisitComputer(IComputer computer)
{
computer.Traverse(this);
}
public void VisitHardware(IHardware hardware)
{
hardware.Update();
foreach(IHardware sh in hardware.SubHardware)
{
sh.Update();
sh.Accept(this);
}
}
public void VisitSensor(ISensor sensor) {
sensor.Accept(this);
}
public void VisitParameter(IParameter parameter) { }
}
[return : MarshalAs(UnmanagedType.Bool)]
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX lpBuffer);
private static void GetTotalMemory()
{
MEMORYSTATUSEX m = new MEMORYSTATUSEX();
ulong phys = 0, virt = 0, swap = 0;
if(GlobalMemoryStatusEx(m))
{
phys = m.ullTotalPhys;
virt = m.ullTotalVirtual;
swap = m.ullTotalPageFile;
} else
{
Console.WriteLine("Reading memory data failed");
Thread.Sleep(new TimeSpan(0, 0, 5));
Environment.Exit(0);
}
totalRam = ((phys + virt + swap) / 1024f) / 1024f;
Console.WriteLine("Reading memory data went successfully");
}
private static int Percentage(float mem)
{
int free = (int)Math.Ceiling(((mem / totalRam) * 100));
int taken = 100 - free;
return taken;
}
private static int GetTemperatureOfType(HardwareType t)
{
Visitor v = new Visitor();
Computer pc = new Computer();
pc.Open();
pc.CPUEnabled = true;
pc.GPUEnabled = true;
pc.Accept(v);
IHardware[] hardware = pc.Hardware;
float r = -1;
for(int i = 0; i < hardware.Length; i++)
{
var h = hardware[i];
if(h.HardwareType == t)
{
for(int j = 0; j < h.Sensors.Length; j++)
{
var s = h.Sensors[i];
Console.WriteLine(s.SensorType.ToString());
if (s.SensorType == SensorType.Temperature)
{
r = s.Value.GetValueOrDefault(-1);
}
}
}
}
pc.Close();
if(r != -1)
{
return (int)Math.Floor(r);
} else
{
throw new Exception("Temperature of component " + t.ToString() + " is null");
}
}
static void Main(string[] args)
{
cpu = new PerformanceCounter("Processor", "% Processor Time", "_Total", true);
ram = new PerformanceCounter("Memory", "Available MBytes");
cpu.NextValue();
GetTotalMemory();
//Uncomment next line for production code
//TODO: Arduino port autodetection
//Comment next line for production code
var pn = "COM1";
port = new SerialPort(pn, 9600, Parity.None, 8, StopBits.One);
port.Handshake = Handshake.None;
port.Open();
port.Write(new byte[] { 0xFF }, 0, 1);
while(true)
{
try
{
var cpusage = (byte)Math.Ceiling(cpu.NextValue());
var ramusage = (byte)Percentage(ram.NextValue());
var cputemp = GetTemperatureOfType(HardwareType.CPU);
var gputemp = GetTemperatureOfType(HardwareType.GpuAti);
} catch(Exception e)
{
Console.WriteLine(e.Message);
}
break;
}
Console.ReadLine();
}
}
}
И, как вы можете видеть, я добавил эту строку для отладки типа датчиков:
Console.WriteLine(s.SensorType.ToString());
Однако это дает:
Нет датчиков температуры
Так в чем проблема? Я написал манифест таким образом, что заставляет приложение
всегда настраиваться как админ. Тот же результат. Но ОМ дает мне результат .
В чем проблема?