Отправка данных на TCP-сервер - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь реализовать программу, которая отправляет данные на TCP-сервер, а затем получает такое же сообщение через COM-порт.У меня есть следующий код, но он отправляет данные, но не получает никаких данных.

Когда я наблюдаю за последовательным портом, я не вижу, что данные получены.

Как я могупочини это?Нужно ли переходить на многопоточную систему или есть другой способ синхронизации?Потому что я вижу, что COM-порт открыт, но не считывается.

И когда я тестирую это с Putty, я могу заставить его работать.

public class Variables
{
    private static int v_VarI = 0;

    public static int VarI
    {
        get { return v_VarI; }
        set { v_VarI = value; }
    }

    private static int v_VarJ = 0;

    public static int VarJ
    {
        get { return v_VarJ; }
        set { v_VarJ = value; }
    }
}

class Program
{
    public class TcpTimeClient
    {
        private const int portNum = 6666;
        private const string hostName = "192.168.1.51";
        private const string data = "test";

        public static int Main(String[] args)
        {

            new SerialPortProgram();

            while (Variables.VarI < 10)
            {
                Byte[] bytesSent = Encoding.ASCII.GetBytes(data);
                try
                {
                    TcpClient client = new TcpClient(hostName, portNum);

                    NetworkStream ns = client.GetStream();

                    byte[] bytes = new byte[1024];
                    ns.Write(bytesSent, 0, bytesSent.Length);
                    int bytesRead = ns.Read(bytes, 0, bytes.Length);

                    client.Close();

                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }
                Variables.VarI++;
                while (Variables.VarJ < Variables.VarI)
                {

                }
            }
            Console.ReadLine();
            return 0;
        }
    }

    public class SerialPortProgram
    {
        public SerialPort receiveport = new SerialPort("COM3", 115200, Parity.None, 8, StopBits.One);

        public SerialPortProgram()
        {
            receiveport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

            receiveport.Open();
        }

        public void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            // Show all the incoming data in the port's buffer
            string rec_data = receiveport.ReadExisting();
            Console.WriteLine(rec_data);
            Variables.VarJ++;
        }
    }
}

Обновление Я обнаружил, что программа, которую я написал, и putty, а также другая программа с именем Serial Port Monitor отличаются по IOCTL_SERIAL_SET_WAIT_MASK.

Serial Port Monitor: 0x00 00 01 19Замазка: неизвестнаСобственная программа: 0x00 00 01 FB

Кто-нибудь знает, как изменить эту маску?Потому что его нет в классе System.IO.Ports.SerialPort.

1 Ответ

0 голосов
/ 30 сентября 2018

Маска ожидания - не ваша проблема.Ваша маска ожидания включает последовательный порт для RXCHAR RXFLAG CTS DSR RLSD BRK ERR RING и включает все, кроме ERR.

Это верно для способа, которым .Net оборачивает последовательные порты, и в любом случае он не отображается в классе последовательных портов .NET.Не тратьте время на поиски этой разницы;Ваша проблема лежит в другом месте.

Ваш код последовательного порта отлично работал в моей системе и распечатал все данные, полученные из внешнего последовательного источника, поэтому я подозреваю, что ваша проблема связана с сервером TCP, код которого вы не опубликовали, илис вашими последовательными портами.Возможно, ваша конфигурация требует, чтобы вы передали что-то до того, как порт начнет отправку?Попробуйте что-то вроде:

            receiveport.Open();
            receiveport.WriteLine("?");

Тогда, если у вас все еще есть проблемы, попробуйте подключиться к другому последовательному устройству, чтобы проверить, можете ли вы доказать, что ваш принимаемый код работает для вас так же, как и для меня.Если вы все еще не можете понять это, опубликуйте больше информации о том, что происходит на конце последовательного источника.

...