• C# com-порт получение информации, обработка старт-бита, стоп-бита?

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    Первое. Отделить мух от котлет. Есть физическая часть протокола - это скорость в бодах, стартовые - стоповые биты и четность. Этим занимается железо порта и на высокий уровень это не пролезает. От программиста требуется задать эти параметры при открытии порта -
    new SerialPort(selectedItem.ToString(), 9600, Parity.None, 416, StopBits.One);

    9600 - скорость, Parity.None - четность, StopBits.One - количество стоповых бит.
    Вот тут все нужно выставить по спецификации.
    Контроллер UART сам будет ждать стартовый бит, считать бит четности и так далее. Если честность не сойдется, программа получит ошибку чтения. Служебные биты (старт, стоп, четность) программисту не передаются.

    Теперь о шине RS485. Это полудуплексный интерфейс - одновременно можно либо передавать, либо слушать. Если ваша задача состоит только в том, чтобы слушать, у вас почти нет проблем.

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

    Увы, на C# я не пишу (и считаю, что общаться со внешними устройствами лучше на C++, дабы приход дворника (сборщика мусора) не обломал весь недо-рилтайм), поэтому мои примеры кода вам просто так не подойдут.

    Идея такая - читаем из порта все, что в нем есть и складываем к себе в буфер. Это в идеале можно делать в отдельном потоке.
    Затем буфер нужно обработать. Это можно сделать тремя способами - регулярным выражением, конечным автоматом и "в лоб".

    Начните с написания программы, которая просто читает поток и выводит его на монитор в hex.
    Ответ написан
    1 комментарий
  • Как файлу передать параметры? И какая их максимальная длина?

    @Sumor
    Пример из MSDN
    using System;
    using System.Windows.Forms;
    
    class Sample 
    {
        public static void Main() 
        {
        String[] arguments = Environment.GetCommandLineArgs();
        MessageBox.Show(String.Join(", ", arguments));
        }
    }
    Ответ написан
    1 комментарий
  • Какие плюсы и минусы в разработке собственного игрового движка?

    lorka
    @lorka
    Game-develop
    На самом деле уже ответили, но тоже внесу свои 5 копеек(ибо те же грабли).
    Серверная часть Java+Apache mina, база на MySQL, контент на XML(по пунктам - кроссплатформенно, бесплатно, быстро, относительно безопасно, без особых проблем портируемо на С/SQL).
    Клиент - Unity3D(на время девелоп - бесплатный, пока что необходимых средств хватает)
    Писать собственный движок == безнадёжно отстать от жизни(если, конечно, под рукой нет штата программеров-акул, уже несколько лет занимающихся гейм-разработкой). Чтобы в этом убедиться, достаточно просто прикинуть план реализации какой-нить "элитной" фичи современных игр - например, воды. Внешний вид, неразрывность, отражения, блики, постэффекты, погружение...
    Соглашусь по поводу - "не написали ни одной игры, а замахнулись на ММО" - писать ММО, да еще и FPS - нетривиальная задача. Вы смотрели статью, где описывалась система игры CounterStrike компенсации пинга для клиентов для стрельбы? А есть еще много нюансов - отображение целей в реальном времени(чтобы не смотрели через стены), защита от head-aim ботов, контроль передвижения(бегущий со скоростью 20км/ч игрок - спидхак? А если он падает?). Вы сейчас выбираете движок для клиента - но ни слова не сказали о серверной части - а это процентов 70 от всего проекта: как бы ни была красива картинка, но если игрок постоянно вылетает/падает сквозь текстуры/получает бан за мнимый спидхак - игра не будет популярна.
    Тем не менее - если нужен готовый конструктор - рекомендую Unity3D
    Если есть рукастый прогер - Ogre3D или AnarchySDK
    Ну и для стартапа - PureBasic(если вы сейчас улыбнулись - посмотрите с Яндекс.картинках игры на нём, с фотоном и ngui)
    В любом случае, удачного старта.
    Ответ написан
    Комментировать
  • Как правильно применять Contract.Require в реализации интерфейсного метода?

    В книге Джозефа Албахари и Бена Албахари «C# 5.0. Справочник. Полное описание языка» глава про контракты кода там очень интересная, советую. Вот, например:

    Контракты на интерфейсах
    и абстрактных методах


    Мощной возможностью контрактов кода является добавление условий к членам интерфейса и абстрактным методам. Двоичное средство перезаписи автоматически привязывает эти условия к конкретным реализациям членов. Специальный механизм позволяет указывать отдельный класс контракта для интерфейсов и абстрактных методов, поэтому можно написать тела методов для хранения условий контрактов. Ниже показано, как это работает:


    [ContractClass (typeof (ContractForITest))] 
    interface ITest 
    { 
        int Process (string s); 
    }
    
    [ContractClassFor (typeof (ITest))] 
    sealed class ContractForITest : ITest 
    {  
        int ITest.Process (string s) // должна использоваться явная реализация. 
        { 
            Contract.Requires (s != null); 
            return 0; // Фиктивное значение, чтобы удовлетворить компилятор. 
        } 
    }


    Обратите внимание, что для удовлетворения компилятора мы должны вернуть значение при реализации метода ITest.Process. Однако код, возвращающий 0, выполняться не будет. Вместо этого двоичное средство перезаписи извлекает из метода только условия и связывает их с реальными реализациями ITest.Process. Это значит, что экземпляры класса контракта никогда в действительности создаваться не будут (и любые конструкторы, которые вы напишете, также выполняться не будут). Внутри блока контракта можно реализовать присваивание временной переменной, чтобы проще было ссылаться на другие методы интерфейса. Например, если в интерфейсе ITest также определено свойство Message типа string, в ITest.Process можно было бы написать следующий код:


    int ITest.Process (string s) 
    { 
        ITest test = this;
        Contract.Requires (s != test.Message);
        ...
    }


    Это проще, чем:

    Contract. Requires (s != ((ITest)this).Message);

    (Простое использование this Message работать не будет, т.к. свойство Message должно быть реализовано явно.) Процесс определения классов контрактов для абстрактных классов выглядит точно так же за исключением того, что класс контракта должен быть помечен как abstract вместо sealed.
    Ответ написан
    Комментировать
  • Как понять этот странный скрипт?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    echoprint.me/codegen что то генерирует, что передается в curl
    -F отправка формы
    @- @ означает что данные отправляютcя как приложенный файл, а минус что отправляемые данные берутся из STDIN (в данном случае то что сгенерировалось после echoprint-codegen ./recorded.mp3 10 20), подробнее можно почитать man curl
    -F, --form
    (HTTP) This lets curl emulate a filled-in form in which a user
    has pressed the submit button. This causes curl to POST data
    using the Content-Type multipart/form-data according to RFC
    2388. This enables uploading of binary files etc. To force the
    'content' part to be a file, prefix the file name with an @
    sign. To just get the content part from a file, prefix the file
    name with the symbol <. The difference between @ and < is then
    that @ makes a file get attached in the post as a file upload,
    while the < makes a text field and just get the contents for
    that text field from a file.

    Example, to send your password file to the server, where 'pass‐
    word' is the name of the form-field to which /etc/passwd will be
    the input:

    curl -F password=@/etc/passwd www.mypasswords.com

    To read content from stdin instead of a file, use - as the file‐
    name. This goes for both @ and < constructs.


    Вот собственно и все.
    Ответ написан
    4 комментария
  • Как отсортировать элементы строчного массива, чтобы элементы выводились по возрастанию?

    using System;
    
    namespace strsort
    {
    	class Program
    	{
    		public static void Main(string[] args)
    		{
    			//данный массив строк
    			string[] m = {"a","abc","ab"};
    			
    			Console.WriteLine("Массив до сортировки:");
    			foreach (string s in m)
    				Console.WriteLine(s);
    			
    			Array.Sort(m);
    			Console.WriteLine();
    			
    			Console.WriteLine("Массив после сортировки:");
    			foreach (string s in m)
    				Console.WriteLine(s);
    			
    			Console.Write("Press any key to continue . . . ");
    			Console.ReadKey(true);
    		}
    	}
    }
    Ответ написан
    Комментировать
  • Как сконвертировать строку decimal to hex в с#?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    string hex = 10008.ToString("x2");
    Посмотреть пример
    int num = 255;
    string hex = num.ToString("x2");
    // переменная hex будет иметь значение ff
    hex = num.ToString("X2");
    // переменная hex будет иметь значение FF

    Массив байт в HEX:
    byte[] data = new byte[] {1,2,3,4,5,128,255};
    string hex = String.Join(" ", data.Select(b=> b.ToString("x2")).ToArray());
    Console.WriteLine(hex);

    На выходе будет:
    01 02 03 04 05 80 ff

    Набор символов в HEX:
    string data = "Привет, человеки!";
    string hex =  String.Join(" ", data.ToString().Select(ch => ((byte)ch).ToString("x2")).ToArray());
    Console.WriteLine(hex);

    или лучше через Encoding получить массив байт из строки:
    string data = "Привет, человеки!";
    string hex =  String.Join(" ", System.Text.Encoding.GetEncoding(1251).GetBytes(data).Select(b => b.ToString("x2")).ToArray());
    Console.WriteLine(hex);

    На выходе будет:
    cf f0 e8 e2 e5 f2 2c 20 f7 e5 eb ee e2 e5 ea e8 21

    В String.Join первым параметром, вместо пробела, можно указать любой набор символов, которым будет объединен массив полученных hex-данных.
    string data = "Привет, человеки!";
    string hex =  String.Join("-", System.Text.Encoding.GetEncoding(1251).GetBytes(data).Select(b => b.ToString("x2")).ToArray());
    Console.WriteLine(hex);

    На выходе:
    cf-f0-e8-e2-e5-f2-2c-20-f7-e5-eb-ee-e2-e5-ea-e8-21
    Ответ написан
    5 комментариев
  • Инди-разработчик HTML5-игр для соц.сетей - еще актуально?

    opium
    @opium
    Просто люблю качественно работать
    поздновато будет все более менее играбельное реализовано
    заработк на приложениях падает в последние годы очень сильно
    придумать новую игру с новым жанром к сожалению не каждому дано
    Ответ написан
    Комментировать
  • Какой инструмент выбрать для автоматического документирования программ?

    @sitev_ru Автор вопроса
    sitev.ru - мой блог ...
    смотрел Doxygen... это самый лучший? других нету?
    Ответ написан
    1 комментарий
  • Чем плох enum в C#?

    GavriKos
    @GavriKos
    Возьмите пиво и допросите своих коллег - пусть альтернативу предлагают. Ничем enum не плох - удобная вещь.
    Ответ написан
    1 комментарий
  • Нужно ли использовать структуры в C#?

    @Sumor
    Используйте классы, если вы не видите преимуществ использования структур в вашем коде.
    Не уверен, что использование структуры со строкой внутри в листе быстрее использования аналогичного класса. Особенно по сравнению со временем доступа к СУБД.
    Подробнее про структуры в MSDN
    Структуры можно использовать:
    1. Если у вас связь с неуправляемым кодом, где ожидается подобная структура.
    2. Если вам критично использование value-типов.
    При этом нужно не забывать об особенностях их использования, например, что при присваивании или передачи в функцию структура копируется. Наверняка можно написать пример, где из-за этого производительность работы с большой структурой будет ниже, чем с классом.
    Ответ написан
    Комментировать
  • Как реализовать выбор и сортировку объектов в Unity3D?

    @Espleth
    Думаю то, что вам нужно habrahabr.ru/post/148410
    Там есть ответы на большую часть ваших вопросов, а остальное можно додумать самостоятельно
    Ответ написан
    Комментировать
  • Как остановить выполнение кода и продолжить его после определенных условий?

    @Oxoron
    Шарпер
    Сделайте в форме2 событие OnConcreteButtonPressed. В первой настройте обработчик (в Вашем случае doSomething), создайте вторую форму, подпишитесь на событие, откройте вторую форму.
    В форме1 будет код вроде
    Form2 f = new Form2();
    f.OnConcreteButtonPressed += doSomething;
    f.Show(); // лучше f.ShowDialog();

    MessageBox() внесите в doSomething().
    Во второй форме при нажатии на кнопку генерируйте событие OnConcreteButtonPressed.
    Ответ написан
    3 комментария
  • Какие инвестиции может привлечь онлайн RPG шутер с элементами хоррора?

    @Evsign
    Какой может быть "чёткий" бизнес план, если вы тут спрашиваете где взять инвестиции?
    Ответ написан
    2 комментария
  • Какие инвестиции может привлечь онлайн RPG шутер с элементами хоррора?

    gadfi
    @gadfi
    https://gamega.org
    есть четкий бизнес план


    Скажу сразу, прибыль с игры будет и не малая.


    Собственно какие инвестиции можно привлечь?


    как между собой все сочетается ?
    Ответ написан
    5 комментариев
  • Куда податься с идеей для игры?

    donkaban
    @donkaban
    Умею рисовать тени
    Идея? Пфффф.
    Ответ написан
    Комментировать
  • План разработки браузера?

    Vapaamies
    @Vapaamies
    Разработчик будущей ОС для ПК размером 250 МБ
    Начать нужно, естественно, со своего языка программирования и компилятора. Потом пишется оконная библиотека, и на ее основе -- браузер.
    Ответ написан
    4 комментария
  • Какие есть бесплатные движки для создания кроссплатформенной 2D игры под ubuntu с правами продажи?

    donkaban
    @donkaban
    Умею рисовать тени
    Как вы достали уже, ей богу.
    Ответ написан
    Комментировать