Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2012, 13:26   #1
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию Управление игрушечной машинкой с компьютера

Приветствую, дорогие друзья! До управления, собственно долековато. Проблема: не открывается COM-port. На WinAPI и Си - открывается.

По ходу разработки этого проекта на C# будут возникать вопросы. Я буду здесь отписываться. Я бы хотел, чтобы форумчане мне помогали в продвижению к целе. На ошибки, недочёты и на правильные подходы к разработке ПО.

Начало такое:
- управление через COM-port
- в качестве машинки, для теста, выступает микроконтроллер AT89S52 из семейства MCS-51 (8052). Микроконтроллер отображает данные, принятые от ПК через COM-port, на LCD мониторчик. В роли данных, на данный момент, это байт-команды: вперёд, назад, влево, вправо. Контроллер программирую в среде Keil c51 uVision 4. Можно программировать в бесплатной демо-версии. В ней ограничение по величине секции кода микроконтроллера. Вроде 2 или 4 КБайта. А можно программировать в версии адаптированной под российские экономические условия: http://avaxhome.ws/software/ke901.html
- прошиваю с помощью программатора "Хамелеон"



Источники:
- Магда Ю.С. "Микроконтроллеры серии 8051. Практический подход"
- www.8052.com
- встроенная справка среды Keil: Complete User's Guide Selection

Ещё бы следующие книги бы где-нибудь найти (особенно хочется по usb): http://avaxhome.ws/software/ke901.html Можно, конечно, купить.

P.S. Если кому интересно, то я могу написать подробную инструкцию, как собрать программатор и начать программировать этот микроконтроллер на С и ассемблере.

Если кратко, то:
- купить, к примеру, этот микроконтроллер: AT89S52 (рублей 80 стоит, или около 100)
- подключить к нему питание (к примеру, от USB), землю, кварцевый резонатор согласно Datasheet на микроконтроллер (обязательно вывод EA микроконтроллера AT89S52 нужно подсоединить к питанию +5; это в случае, если не используется микросхема внешней памяти)
- скачать и запустить программу "Хамелеон". В google: программатор хамелеон
- при нажатии на кнопку "Выбор" на панели "Микросхемы (модуль)", появится окно "Выбор микросхемы". Там есть вкладка "Схема". Это схема подключения микроконтроллера AT89S52 к LPT порту (эх... сейчас не у всех старые компьтеры сохранились...)
- установить Keil c51 uVision 4
- написать программу (для теста, к примеру, мигание диодом)
- установить в опциях проекта Keil, "генерировать hex файл" и откопилировать проект
- в программе "Хамелеон" нажимаем "Открыть файл" и нажимаем "Программирование FLASH"

P.S. Вот хороший ресурс, где можно картинки для меню, кнопок и т.д. брать: http://www.iconfinder.com/search/?q=arrow
8Observer8 вне форума Ответить с цитированием
Старый 26.10.2012, 13:27   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Архив с проектом VC# 2010 Express приложил к этому сообщению.



Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace SmallMachine
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void toolStripButtonSettings_Click(object sender, EventArgs e)
        {
            Form2 formSettings = new Form2(SmallMachine.Properties.Settings.Default.PortName, 
                                           SmallMachine.Properties.Settings.Default.BaudRate);
            buttonDown.Enabled = false;
            buttonLeft.Enabled = false;
            buttonRight.Enabled = false;
            buttonUp.Enabled = false;
            formSettings.ShowDialog();
        }

        // Open Port
        SerialPort sp;
        private void toolStripButtonOpenPort_Click(object sender, EventArgs e)
        {
            // Status Bar
            toolStripStatusLabelPortName.Text = "Port Name: " + SmallMachine.Properties.Settings.Default.PortName;
            toolStripStatusLabelBaudRate.Text = "BaudRate: " + SmallMachine.Properties.Settings.Default.BaudRate.ToString();

            // Open Port
            sp = new SerialPort(SmallMachine.Properties.Settings.Default.PortName);
            if (!sp.IsOpen)
            {
                MessageBox.Show("Cannot open the port: " + SmallMachine.Properties.Settings.Default.PortName + ". Try again.");
                sp.Dispose();
                return;
            }
            buttonDown.Enabled = true;
            buttonLeft.Enabled = true;
            buttonRight.Enabled = true;
            buttonUp.Enabled = true;

            try
            {
                sp.PortName = SmallMachine.Properties.Settings.Default.PortName;
                sp.BaudRate = SmallMachine.Properties.Settings.Default.BaudRate;
            }
            finally
            {
                MessageBox.Show("Cannot set PortName and BaudRate");
                sp.Dispose();
            }

            MessageBox.Show("Port: " + SmallMachine.Properties.Settings.Default.PortName + " is opening");
        }

        private void buttonUp_Click(object sender, EventArgs e)
        {

        }
    }
}
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SmallMachine
{
    public partial class Form2 : Form
    {
        public Form2(string PortName, Int32 BaudRate)
        {
            InitializeComponent();
            comboBoxPortName.SelectedIndex = comboBoxPortName.FindString(PortName);
            comboBoxBaudRate.SelectedIndex = comboBoxBaudRate.FindString(BaudRate.ToString());
        }

        private void buttonOk_Click(object sender, EventArgs e)
        {
            SmallMachine.Properties.Settings.Default.PortName = comboBoxPortName.SelectedItem.ToString();
            SmallMachine.Properties.Settings.Default.BaudRate = Convert.ToInt32(comboBoxBaudRate.SelectedItem);
            Close();
        }

        private void buttonCancel_Click(object sender, EventArgs e)
        {
            Close();
        }
    }
}
8Observer8 вне форума Ответить с цитированием
Старый 26.10.2012, 13:28   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Сдедующая программа (на WinAPI и Си) работает нормально. Программу взял из книги: Магда Ю.С. "Микроконтроллеры серии 8051. Практический подход"



Код:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>

int main()
{
    HANDLE hCom;
    TCHAR *pcComPort = _T("COM5");
    DCB dcb;

    DWORD bytesWritten;
    __int8 i1;

    hCom = CreateFile( pcComPort,
                       GENERIC_READ | GENERIC_WRITE,
                       0,
                       NULL,
                       OPEN_EXISTING,
                       0,
                       NULL);

    if (hCom == INVALID_HANDLE_VALUE)
    {
        _tprintf(_T("COM5 openning error!\n"));
        return;
    }

    GetCommState(hCom, &dcb);
    _tprintf(_T("COM5 baud rate is %d\n"), dcb.BaudRate);

    while (1)
    {
        _tprintf(_T("\nEnter value to be outputted at COM5 port:"));
        _tscanf(_T("%du"), &i1);
        WriteFile( hCom,
                   &i1,
                   sizeof(i1),
                   &bytesWritten,
                   NULL);
    }

    CloseHandle(hCom);
    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 26.10.2012, 13:35   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
До управления, собственно долековато. Проблема: не открывается COM-port. На WinAPI и Си - открывается.
так вопрос-то в чем? Уже все в шоколаде?

Под C# тоже никто не запрещает вызывать WinAPI функции напрямую, без оберток типа SerialPort.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 26.10.2012, 14:00   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

raxp, вы меня огоришили этой новостью! Я думал, что С# этого не позволит. Это хорошая новость. Это расширяет свободу!

Но всё-таки я бы хотел, чтобы мне подсказали, как сделать, чтобы программа заработала?
8Observer8 вне форума Ответить с цитированием
Старый 26.10.2012, 14:04   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

SmallMachine.Properties.Settings.De fault.PortName чему равно? "СOM5" как и в последнем примере или регистр символов какой другой?

Что показывает сниффер COM-портов?

Цитата:
огоришили этой новостью
http://msdn.microsoft.com/en-us/magazine/cc164123.aspx
http://www.pinvoke.net/default.aspx/kernel32.createfile
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 26.10.2012 в 14:07.
raxp вне форума Ответить с цитированием
Старый 26.10.2012, 14:05   #7
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Вы неправильно перевели на с#.
Цитата:
if (!sp.IsOpen)
это тут рано проверять.
Сначала настраиваете порт а потом открываете методом Open. И только потом проверять опенед или нет.
eval вне форума Ответить с цитированием
Старый 26.10.2012, 14:09   #8
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Зачем мудохаться с pinvoke, если уже это сделали? незачем.
eval вне форума Ответить с цитированием
Старый 26.10.2012, 14:13   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

маршаллинг, варианты есть ...в QT тоже помню обертку делали и баг с управлением битами
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 26.10.2012, 16:08   #10
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
SmallMachine.Properties.Settings.De fault.PortName чему равно?
У меня как-то была такая ошибка, забыл переменные инициализировать. Но сейчас:



Цитата:
Сообщение от raxp Посмотреть сообщение
"СOM5" как и в последнем примере или регистр символов какой другой?
Я проверил. Регистр неважен. То есть в comboBox можно написать: com5

Цитата:
Сообщение от raxp Посмотреть сообщение
Что показывает сниффер COM-портов?
сниффером ещё не пользовался, но подозреваю, что это очень полезная штука. Посоветуйте, пожалуйста, какой-нибудь, которым сами пользовались и вам понравился. В google ничего привлекательного не нашёл.

Цитата:
Сообщение от eval Посмотреть сообщение
Вы неправильно перевели на с#.
это тут рано проверять.
Сначала настраиваете порт а потом открываете методом Open. И только потом проверять опенед или нет.
Огромное спасибо! Работает! Я ещё код немного изменил: finally на catch поменял, return добавил в блок catch и открытие порта поместил в блок try. Вроде правильно получилось. Ещё на железе не проверял, так как старый комьютер в очередной раз перестал загружаться. Даже до загрузки системы не доходит дело. Жужжит, а монитор, и мышка потухшие. Надо будет купить USB-COM переходник. И программатор сделать на COM-port'e. Пытался освоить USB, но это слишком сложно. Остановлюсь пока на COM.



Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace SmallMachine
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void toolStripButtonSettings_Click(object sender, EventArgs e)
        {
            Form2 formSettings = new Form2(SmallMachine.Properties.Settings.Default.PortName, 
                                           SmallMachine.Properties.Settings.Default.BaudRate);
            buttonDown.Enabled = false;
            buttonLeft.Enabled = false;
            buttonRight.Enabled = false;
            buttonUp.Enabled = false;
            formSettings.ShowDialog();
        }

        // Open Port
        SerialPort sp;
        private void toolStripButtonOpenPort_Click(object sender, EventArgs e)
        {
            // Status Bar
            toolStripStatusLabelPortName.Text = "Port Name: " + SmallMachine.Properties.Settings.Default.PortName;
            toolStripStatusLabelBaudRate.Text = "BaudRate: " + SmallMachine.Properties.Settings.Default.BaudRate.ToString();

            // Setting of Port
            sp = new SerialPort();
            try
            {
                sp.PortName = SmallMachine.Properties.Settings.Default.PortName;
                sp.BaudRate = SmallMachine.Properties.Settings.Default.BaudRate;
            }
            catch
            {
                MessageBox.Show("Cannot set PortName and BaudRate");
                sp.Dispose();
                return;
            }

            // Open Port
            try
            {
                sp.Open();
            }
            catch
            {
                MessageBox.Show("Cannot open the port: " + SmallMachine.Properties.Settings.Default.PortName + ". Try again.");
                sp.Dispose();
                return;
            }

            if (!sp.IsOpen)
            {
                MessageBox.Show("Cannot open the port: " + SmallMachine.Properties.Settings.Default.PortName + ". Try again.");
                sp.Dispose();
                return;
            }

            buttonDown.Enabled = true;
            buttonLeft.Enabled = true;
            buttonRight.Enabled = true;
            buttonUp.Enabled = true;

            MessageBox.Show(SmallMachine.Properties.Settings.Default.PortName + " is opening");
        }

        private void buttonUp_Click(object sender, EventArgs e)
        {

        }
    }
}
Вложения
Тип файла: zip SmallMachine.zip (135.5 Кб, 22 просмотров)
Тип файла: zip Images.zip (18.2 Кб, 12 просмотров)

Последний раз редактировалось 8Observer8; 26.10.2012 в 16:35. Причина: орфография; приложил проект и картинки (иконку, руль и стрелочки)
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод конфигурации компьютера и управление клавиатурой, компилятор gcc Enchance Общие вопросы C/C++ 0 04.11.2010 21:26
Управление питанием компьютера Blade Общие вопросы C/C++ 1 09.01.2009 17:57
Управление устройствами компьютера ilmar Помощь студентам 5 22.07.2008 16:04
Управление механизмами с компьютера. Что изучать? Ivanushka Помощь студентам 2 20.07.2008 07:52
Управление настройками компьютера из приложения Delphi Saili Общие вопросы Delphi 2 05.12.2006 11:41