Не удается получить данные с последовательного порта
Я пытаюсь получать и записывать данные в txt-файл, я проверил этот пост и правильно добавил eventHandler. Последовательность открытия и т. д. одинакова. Однако я не могу получать данные, даже когда пытаюсь печатать внутри
SerialPort_DataReceivedэто ничего не значит. Я не могу получить данные.
p.CmdSerialPort.DataReceivedвсегда равно нулю, что бы я ни менял.
Может кто-нибудь помочь?
using System; using System.Linq; using System.IO; using System.IO.Ports; using System.Diagnostics; using System.Net; using System.Net.Sockets; namespace Logger { public class SPWrapper { public System.IO.Ports.SerialPort CmdSerialPort; public StreamWriter swLog; public DateTime lastComm = DateTime.MinValue; public UdpClient udpClient_Cmd; public volatile bool _enabled_Cmd; public static int Ethernet_Packet_Header_Length = 14; public IPAddress IP { get; set; } public int Cmd_Port { get; set; } //////////////////////////////////////////////////////////// // SERIAL PORT //////////////////////////////////////////////////////////// public bool TryConnect(string portName) { try { CmdSerialPort.PortName = portName; CmdSerialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(SerialPort_DataReceived); CmdSerialPort.Open(); if (CmdSerialPort.IsOpen) { return true; } return false; } catch (UnauthorizedAccessException e) { Debug.WriteLine(e.ToString()); Debug.WriteLine(e.Message); return false; } catch (ArgumentOutOfRangeException e) { Debug.WriteLine(e.ToString()); Debug.WriteLine(e.Message); return false; } catch (ArgumentException e) { Debug.WriteLine(e.ToString()); Debug.WriteLine(e.Message); return false; } } internal void Close2() { if (CmdSerialPort.IsOpen) { CmdSerialPort.Close(); } swLog.Close(); swLog = null; } public void SerialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { lastComm = DateTime.Now; if (sender is SerialPort sp) { string indata = sp.ReadExisting(); indata = indata.Trim(' ').Trim('\n').Trim('\r'); WriteToFile($"{CmdSerialPort.PortName}\t{lastComm}\t{indata}"); } } public void WriteToFile(string v) { swLog.WriteLine(v); } //////////////////////////////////////////////////////////// // ETHERNET //////////////////////////////////////////////////////////// public IPEndPoint IPE_Cmd; internal void Close() { udpClient_Cmd?.Close(); } public bool Initialize() { bool retVal = true; IPE_Cmd = new IPEndPoint(IP, Cmd_Port); try { udpClient_Cmd = new UdpClient(); udpClient_Cmd.Client.Bind(IPE_Cmd); _enabled_Cmd = true; udpClient_Cmd.BeginReceive(new AsyncCallback(ReceiveCallbackCmd), null); } catch (Exception ex) { retVal = false; udpClient_Cmd?.Close(); udpClient_Cmd = null; Debug.WriteLine(ex.ToString()); Debug.WriteLine(ex.Message); Debug.WriteLine(ex.InnerException?.ToString()); } return retVal; } public void ReceiveCallbackCmd(IAsyncResult ar) { DateTime now = DateTime.Now; IPEndPoint e = new IPEndPoint(IPAddress.Any, 0); byte[] receiveBytes = null; try { receiveBytes = udpClient_Cmd?.EndReceive(ar, ref e); Console.WriteLine(receiveBytes); } catch (ObjectDisposedException) { _enabled_Cmd = false; udpClient_Cmd?.Close(); udpClient_Cmd = null; } if (receiveBytes != null) { string UDP_Read_Message = System.Text.Encoding.UTF8.GetString(receiveBytes.Skip(Ethernet_Packet_Header_Length).ToArray()); WriteToFile($"{e}\t{now}\t{UDP_Read_Message}"); } if (_enabled_Cmd) { udpClient_Cmd?.BeginReceive(new AsyncCallback(ReceiveCallbackCmd), null); } } } class Program { public static SPWrapper p; static void Main(string[] args) { Console.WriteLine("Please Enter Parameters: "); p = new SPWrapper(); p.IP = IPAddress.Parse("....");//IP //serial port configurations p.CmdSerialPort = new SerialPort(); p.CmdSerialPort.Handshake = Handshake.None; p.CmdSerialPort.BaudRate = 115200; p.CmdSerialPort.Parity = Parity.None; p.CmdSerialPort.StopBits = StopBits.One; p.CmdSerialPort.DataBits = 8; //takes port, ethernet and filename inputs string s = Console.ReadLine(); string[] input = s.Split(' ').ToArray(); if (input.Length > 3) Console.WriteLine("Wrong input size!"); string filename = input[2];//takes filename //DEFAULT PATH ROOT String root = @".\\"; string path_combined; filename += ".txt"; path_combined = Path.Combine(root, filename); try { if (p.TryConnect(input[0]))//takes port name eg.COM9 p.swLog = File.CreateText(path_combined); } catch (System.IndexOutOfRangeException ex) { System.ArgumentException argEx = new System.ArgumentException("File creation failed!", ex); throw argEx; } p.Cmd_Port = Int32.Parse(input[1]);//takes port number eg.4667 p.Initialize(); Console.ReadKey(); p.Close2(); p.Close(); }//end of main } }
Что я уже пробовал:
Я поставил точки останова рядом со всеми open() и close(), кажется, они работают нормально, но я считаю, что проблема может возникнуть из-за
CmdSerialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(SerialPort_DataReceived);
В официальной ссылке microsoft эта строка ставится перед open(). Все равно я получаю пустой txt-файл, его нельзя записать.