Соединение COM портов. Подключения создаются, но сервер и клиент друг друга не видят - C#

Узнай цену своей работы

Формулировка задачи:

имеется класс с методами подключения:
using System;
using System.Text;
using System.Runtime.InteropServices;
using System.IO.Pipes;
using System.Security.Principal;
using System.IO.Ports;
 
[Guid("FB8253D0-BECC-4e94-9B48-BCAB62BAAE3B")]
public interface ICom
{
    [DispId(1)]
    bool Connect(string PortName);
    void Disconnect();
    string Receive();
    void Send(string message);
}
 
[Guid("A05EB863-5126-43d6-8D8B-202BFA543D80"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IComEvents
{
}
 
[Guid("B1C0F778-2A43-4928-9F47-D82FF4FB75DB"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(IComEvents))]
public class portCom : ICom
{
    SerialPort port;
 
    public bool Connect(string PortName)
    {
        port = new SerialPort();
 
        port.PortName = PortName;
        port.BaudRate = 9600;
        port.Parity = Parity.None;
        port.DataBits = 8;
        port.StopBits = StopBits.One;
        port.Handshake = Handshake.None;
        port.DtrEnable = true;
        port.RtsEnable = true;
 
        port.ReadTimeout  = 10000;
        port.WriteTimeout = 10000;
        port.Open();
        return true;
    }
 
    public void Disconnect()
    {
        try
        {
            port.Close();
        }
        catch (Exception)
        { }
    }
 
    public string Receive()
    {
        byte[] bytes = new byte[1024];
        int length = port.Read(bytes, 0, bytes.Length);
        return Encoding.UTF8.GetString(bytes, 0, length);
    }
 
    public void Send(string message)
    {
        byte[] log = Encoding.UTF8.GetBytes(message);
        port.Write(log, 0, log.Length);
    }
}
имеется клиент:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.IO.Ports;
 
public class AsynchronousSocketClient
{
    public static void StartClient()
    {
        string word = null;
        try
        {
            Console.WriteLine("Идет поиск сервера...");
            portCom client = new portCom();
            client.Connect("COM1");
            Console.WriteLine("Успешно подключен");
 
            bool flag = true;
            while (flag)
            {
                Console.WriteLine("Системное сообщение: {0}", client.Receive());
 
                word = Console.ReadLine();
                client.Send(word);
 
                if (word == "quit")
                {
                    flag = false;
                }
            }
            client.Disconnect();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }
 
    public static int Main(String[] args)
    {
        StartClient();
 
        Console.ReadLine();
        return 0;
    }
}
имеется сервер:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Collections.Generic;
 
public class SocketListener
{
    private static int threadCount = 10;
    public static string data = null;
    public static string reciveLogin = null;
    public static string recivePass = null;
    public static string loginMsg = null;
    public static string done = null;
    static List<string> name = new List<string>();
    static List<string> pass = new List<string>();
    static bool flag;
    static bool logined;
    static bool newClient;
    public static Mutex mut = new Mutex();
    public static Mutex mutex = new Mutex();
 
    static void newAccount(object hand)
    {
        portCom handler = (portCom)hand;
        mut.WaitOne();
            // Просим логин
            loginMsg = "Введите логин: ";
            handler.Send(loginMsg);

            // Принимаем логин
            reciveLogin = handler.Receive();
            name.Add(reciveLogin);
            Console.WriteLine("Зарегестрированный логин от клиента {0}: {1}", Thread.CurrentThread.Name, reciveLogin);
 
            //Просим пароль
            loginMsg = "Введите пароль: ";
            handler.Send(loginMsg);
 
            //Принимаем пароль
            recivePass = handler.Receive();
            pass.Add(recivePass);
            Console.WriteLine("Зарегестрированный пароль от клиента {0}: {1}", Thread.CurrentThread.Name, recivePass);
        mut.ReleaseMutex();
        logined = false;
        flag = true;
    }
 
    static void newLog(object hand)
    {
        portCom handler = (portCom)hand;
        bool log_fl = true;
        mut.WaitOne();
        while (log_fl)
        {
            // Просим логин
            loginMsg = "Логин: ";
            handler.Send(loginMsg);
 
            // Принимаем логин
            reciveLogin = handler.Receive();
            Console.WriteLine("Полученный логин от клиента {0}: {1}", Thread.CurrentThread.Name, reciveLogin);
 
            //Просим пароль
            loginMsg = "Пароль: ";
            handler.Send(loginMsg);
 
            //Принимаем пароль
            recivePass = handler.Receive();
            Console.WriteLine("Полученный пароль от клиента {0}: {1}", Thread.CurrentThread.Name, recivePass);
            for (int i = 0; i < name.Count; i++)
            {
                if (reciveLogin == name[i] && recivePass == pass[i])
                {
                    log_fl = false;
                    break;
                }
            }
        }
        mut.ReleaseMutex();
        flag = true;
        logined = false;
    }
 
    static void newConnect(object hand)
    {
       mutex.WaitOne();
       portCom server = new portCom();        
        try
        {
            bool a = false;
            do { a = server.Connect("COM2");} while(a == false);                
 
            Console.WriteLine("Клиент номер {0} успешно подключен", Thread.CurrentThread.Name);
 
           // newClient = true;
            flag = true;
            string text = null;
            string dect;
            logined = false;
            Thread threadReg = new Thread(newAccount);
            Thread threadLog = new Thread(newLog);
 
            //  Выбор регистрация или логин
            while (true)
            {
                if (flag)
                {
                    data = null;
                    reciveLogin = null;
                    recivePass = null;
 
                    text = "\n1-Регистрация\n2-Вход";
                    server.Send(text);
                    dect = server.Receive();
 
                    if (dect == "1")
                    {
                        threadReg.Start(server);
                        flag = false;
                    }
                    else if (dect == "2")
                    {
                        threadLog.Start(server);
                        logined = true;
                        flag = false;
                    }
                }
                if (logined) break;
            }
            while (true)
            {
                if (flag)
                {
                    data = null;
                    data = "Введите команду: ";
                    server.Send(data);
 
                    data = server.Receive();
                    Console.WriteLine("Полученый текст от клиента {0}: {1}", Thread.CurrentThread.Name, data);
 
                    if (data == "quit")
                    {
                        server.Disconnect();
                        Thread.CurrentThread.Interrupt();
                    }
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            Console.WriteLine("Клиент номер {0} отключен", Thread.CurrentThread.Name);
        }
        mutex.ReleaseMutex();
    }
 
    public static void StartListening()
    {
        string testLogin = "a";
        string testPass = "s";
        logined = false;
        flag = true;
        name.Add(testLogin);
        pass.Add(testPass); //int index = 1;
        Thread[] servers = new Thread[threadCount];
        newClient = true;
        Console.WriteLine("Ожидание подключения...");
        for (int i = 0; i < threadCount; i++)
        {
            while (!newClient) { }
            servers[i] = new Thread(newConnect) { Name = (i + 1).ToString() };
            servers[i].Start();
            newClient = false;
        }
    }
 
    public static int Main(String[] args)
    {
        StartListening();
        return 0;
    }
}
Подключения создаются, но друг друга не видят порты виртуальные, создаются при помощи вот этой штуки

Решение задачи: «Соединение COM портов. Подключения создаются, но сервер и клиент друг друга не видят»

textual
Листинг программы
using System;
using System.Text;
using System.Runtime.InteropServices;
using System.IO.Pipes;
using System.Security.Principal;
using System.IO.Ports;
 
[Guid("FB8253D0-BECC-4e94-9B48-BCAB62BAAE3B")]
public interface ICom
{
    [DispId(1)]
    void Connect(string PortName);
    void Disconnect();
    string Receive();
    void Send(string message);
}
 
[Guid("A05EB863-5126-43d6-8D8B-202BFA543D80"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IComEvents
{
}
 
[Guid("B1C0F778-2A43-4928-9F47-D82FF4FB75DB"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(IComEvents))]
public class portCom : ICom
{
    SerialPort port;
 
    public void Connect(string PortName)
    {
        port = new SerialPort();
 
        port.PortName = PortName;
        port.BaudRate = 9600;
        port.Parity = Parity.None;
        port.DataBits = 8;
        port.StopBits = StopBits.One;
        port.Handshake = Handshake.None;
        port.RtsEnable = true;
 
        port.ReadTimeout = 100000;
        port.WriteTimeout = 100000;
        port.Open();
    }
 
    public void Disconnect()
    {
        do
        {
            try
            {
                port.Close();
            }
            catch (Exception) { }
        } while (port.IsOpen);
    }
 
    public string Receive()
    {
        try
        {
            return port.ReadLine();
        }
        catch (Exception)
        {
            return "";
        }
    }
 
    public void Send(string message)
    {
        try
        {
            port.WriteLine(message);
        }
        catch (Exception) { }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.4 из 5
Похожие ответы