ФорумПрограммированиеБольше языковC/C++ и C# → Моя программа C# (COM & TCP/IP)

Моя программа C# (COM & TCP/IP)

  • Kitam1n

    Сообщения: 8 Репутация: N Группа: Кто попало

    Spritz 14 мая 2012 г. 13:02

    Здарова!
    Изучаю с нуля C# на Visual Studio. Написал программу для работы с микроконтроллером через COM-порт.
    Суть: нажимая button или двигая trackBar (короче делая что-то в форме) в COM-порт отправляются 3 байта, микроконтроллер принимает их и выполняет свою заложенную программу, каждый байт отвечает за что-то.
    Допустим при нажатии на button в COM-порт отправляются 3 байта (каждый из своей textBox1,2,3):

                   byte[] buffer = new byte[3];
                   buffer[0] = Convert.ToByte(textBox1.Text);
                   buffer[1] = Convert.ToByte(textBox2.Text);
                   buffer[2] = Convert.ToByte(textBox3.Text);
                   try
                   {
                       serialPort1.Write(buffer, 0, 3);
                   }


    Программа работает идеально. Но теперь необходимо управление не с локальной машины, а по сети. Скачал исходник Клиент-Сервер, связь устанавливается, могу отправлять текстовые сообщения, через текстовые сообщения могу отправлять и свои байты, при приеме их делю и вывожу в label1,2,3

    Клиент отправляет Серверу:
              byte[] buffer = Encoding.Default.GetBytes(textBox1.Text + '|' + textBox2.Text + '|' + textBox3.Text);
                   ns.Write(buffer, 0, buffer.Length);


    Сервер принимает. делит и выводит в label:
            public void UpdateReceiveDisplay(string message)
           {
               string[] split_data = message.Split('|');
               label4.Text = split_data[0];
               label5.Text = split_data[1];
               label6.Text = split_data[2];
           }


    Это работает но иногда кривовато и сдается мне что не совсем правильно.
    Подскажите как лучше отправлять и получать эти данные для последующей отправки в COM?
    Спустя 189 сек.
    Микроконтроллер управляет этой штукой, если интересно

    http://youtu.be/rteBi4YWy98
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz 14 мая 2012 г. 13:07, спустя 4 минуты 29 секунд

    http://fursoffers.narod.ru/Packets.htm вот эта статья мне в свое время помогла, а через Split это нубский вариант )
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • Kitam1n

    Сообщения: 8 Репутация: N Группа: Кто попало

    Spritz 14 мая 2012 г. 13:31, спустя 23 минуты 58 секунд

    Китайская грамота, что именно из этого должно мне помочь?
    Спустя 151 сек.
    В соседней теме с рисованием вы использовали именно разделение…
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz 14 мая 2012 г. 13:49, спустя 18 минут 33 секунды

    В соседней теме с рисованием вы использовали именно разделение…

    время летит, уровень растет )

    что именно из этого должно мне помочь?

    способ оформления пакетов

    создаются типы пакетов, каждый пакет разделен на N блоков, каждый блок имеет длину K байтов, для каждого типа количество блоков и длина каждого из них зафиксирована

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

    например, тип пакета "сообщение чата", допустим его длина 10 байтов

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

    сам текст может занимать места меньше, чем отведенные ему 6 байтов, в таком случае оставшиеся байты заполняются нулями

    List<byte> packet = new List<byte>();
    int packetId = 45;
    byte[] id = new byte[3]
    byte[] message = new byte[5];
    id = Convert.ToByte(packetId);
    string messageT = "hello, world!";
    message = Encoding.UTF8.GetBytes(messageT);
    packet.AddRange(id);
    packet.AddRange(message);
    Socket.Send(packet.ToArray());
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 14 мая 2012 г. 14:01, спустя 11 минут 37 секунд

    время летит, уровень растет )

    судя по коду - не сильно))))))))))))))))))))) :D
    Сапожник без сапог
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz 14 мая 2012 г. 14:04, спустя 3 минуты

    phpdude, ты бы еще по нику моему судил о моих способностях ;)
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • Kitam1n

    Сообщения: 8 Репутация: N Группа: Кто попало

    Spritz 14 мая 2012 г. 14:15, спустя 11 минут 31 секунду

    Frozzeg, принцип понял. Но зачем мне идентификатор типа, когда у меня только один тип и другого типа не будет!

    Говоря твоим языком мне нужно отправлять /получать 3 блока длинной 1 байт каждый. И все, никаких идентификаторов перед пакетом. Ну если он так нужен то можно и с ним конечно(на будущее), но он статичен(пока).
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 14 мая 2012 г. 14:16, спустя 40 секунд

    Frozzeg, я по ним и сужу, хули ты как дурак то
    Сапожник без сапог
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz 14 мая 2012 г. 14:20, спустя 3 минуты 38 секунд

    Kitam1n, все правильно понял, идентификатор в данном случае не нужен
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • Kitam1n

    Сообщения: 8 Репутация: N Группа: Кто попало

    Spritz 14 мая 2012 г. 14:52, спустя 32 минуты 48 секунд

    1)

    Kitam1n, все правильно понял, идентификатор в данном случае не нужен


    Ага, только не понял как это теперь отправлять и как получать? Короче вернулся к началу. Конкретный код какой?

    List<byte> packet = new List<byte>();
    int packetId = 45;
    byte[] id = new byte[3]
    byte[] message = new byte[5];
    id = Convert.ToByte(packetId);
    string messageT = "hello, world!";
    message = Encoding.UTF8.GetBytes(messageT);
    packet.AddRange(id);
    packet.AddRange(message);
    Socket.Send(packet.ToArray());


    int packetId = 45; - идинтификатор пакета?
    byte[] id = new byte[3] - колличество байтов в индентификаторе?
    id = Convert.ToByte(packetId); - это не компилируется!
    string messageT = "hello, world!"; - само сообщение. В моем случае что тут должно быть? textBox1.Text + textBox2.Text + еextBox3.Text ???

    И остальное тоже ниче не понятно :)

    2) Может сделать проще? в клиенте есть textBox1,2,3. Какой конкретно код нужен что бы отправить эти значения на сервер и вывести в label1,2,3 ?

    3) а такой вариант отправки как принять?
    byte[] buffer = new byte[3];
    buffer[0] = Convert.ToByte(textBox1.Text);
    buffer[1] = Convert.ToByte(textBox2.Text);
    buffer[2] = Convert.ToByte(textBox3.Text);
    ns.Write(buffer, 0, 3);

    Я принимаю абракодабру, а мне еее нужно в label вывести

  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz 14 мая 2012 г. 15:04, спустя 11 минут 43 секунды

    может стоит тогда учебник почитать?
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • Kitam1n

    Сообщения: 8 Репутация: N Группа: Кто попало

    Spritz 14 мая 2012 г. 15:15, спустя 11 минут 16 секунд

    Легче всего отправить читать учебник вместо того что бы помочь и дать конкретный код. Тут может дело то пустяковое, не хватает ерунды какой, как пить дать я вокруг хожу. Мне нужно сделать это и продолжать дальше проект, а приходится углубляться в знания которые мне возможно никогда больше не понадобятся.
    И на том спасибо!
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz 14 мая 2012 г. 15:27, спустя 11 минут 42 секунды

    как говорится: Тут не копают за вас, но показывают, в каком направлении копать )

    ибо я сам ничего не помню, писал по памяти
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • Kitam1n

    Сообщения: 8 Репутация: N Группа: Кто попало

    Spritz 14 мая 2012 г. 15:44, спустя 16 минут 25 секунд

    Да, еще хотел спросить, Сплит хоть и нубский вариант но работает, какие конкретно у него минусы? Если так оставить разница будет?
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz 14 мая 2012 г. 16:02, спустя 18 минут 21 секунду

    конкретно в твоем случае в принципе разницы нет, но при передаче более сложных данных придется делать лишние преобразования, скорость упадет, да и вдруг понадобиться в самом пакете пересылать символ '|', получится неразбериха
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!