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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2010, 16:08   #1
lexluter1988
Пользователь
 
Аватар для lexluter1988
 
Регистрация: 20.04.2010
Сообщений: 47
По умолчанию работа с COM-портом в C#. нужен диалог.настройки

Если кому полезно, то вот абсолютно рабочий код работы с COM портом.
Взял из книги Агурова и заставил работать в visual studio 2008.
Кто подсткажет как сделать диалоговое окно настройки параметров порта, т.е. baud rate , parity, stop bits.
Уточню-диалог сделать не трудно, чекбоксы или радио-кнопки.
Вопрос в том как сделать так, чтобы отображались только существующие порты с их именами. А то у разных компов номера разные.
Или например виртуальный Com нумеруется по-разному.
Всем спасибо.
Изображения
Тип файла: png lex.png (6.8 Кб, 268 просмотров)
lexluter1988 вне форума Ответить с цитированием
Старый 15.05.2010, 16:09   #2
lexluter1988
Пользователь
 
Аватар для lexluter1988
 
Регистрация: 20.04.2010
Сообщений: 47
По умолчанию

Код:
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.Runtime.InteropServices;

namespace Используем_COM_порт
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public enum Parity : byte
        {
            No = 0,
            Odd = 1,
            Even = 2,
            Mark = 3,
            Space = 4
        }
        public enum StopBits : byte
        {
            Bits1 = 0,
            Bits1_5 = 1,
            Bits2 = 2
        }
        class CommPort
        {
            private int PortNum;
            private int BaudRate;
            private byte ByteSize;
            private Parity parity;
            private StopBits stopBits;
            private int hPortHanle = INVALID_HANDLE_VALUE;

            public CommPort(int PortNum, int BaudRate, byte ByteSize, 
                               Parity parity, StopBits stopBits)
            {
                this.PortNum = PortNum;
                this.BaudRate = BaudRate;
                this.ByteSize = ByteSize;
                this.parity = parity;
                this.stopBits = stopBits;
            }

            public bool Open()
            {
                //Открытие порта
                hPortHanle = CreateFile("COM" + PortNum, GENERIC_READ |
                                    GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
                if(hPortHanle == INVALID_HANDLE_VALUE)
                {
                    return false;
                }

                //Настройка порта
                DCB dcbCommPort = new DCB();
                GetCommState(hPortHanle, ref dcbCommPort);
                dcbCommPort.BaudRate = BaudRate;
                dcbCommPort.Parity = (byte)parity;
                dcbCommPort.ByteSize = ByteSize;
                dcbCommPort.StopBits = (byte)stopBits;
                if(!SetCommState(hPortHanle, ref dcbCommPort))
                {
                    return false;
                }
                return true;
            }

            //Возвращает true, если порт открыт
            public bool IsOpen()
            {
                return (hPortHanle != INVALID_HANDLE_VALUE);
            }

            //Закрытие порта
            public void Close()
            {
                if(IsOpen())
                {
                    CloseHandle(hPortHanle);
                }
            }

            //Чтение данных
            public byte[] Read(int NumBytes)
            {
                byte[] BufBytes;
                byte[] OutBytes;
                BufBytes = new byte[NumBytes];
                if (hPortHanle != INVALID_HANDLE_VALUE)
                {
                    int BytesRead = 0;
                    ReadFile(hPortHanle, BufBytes, NumBytes, ref BytesRead, 0);
                    OutBytes = new byte[BytesRead];
                    Array.Copy(BufBytes, OutBytes, BytesRead);
                }
                else
                {
                    throw (new ApplicationException("Порт не был открыт"));
                }
                return OutBytes;
            }

                //Передача данных
                public void Write(byte[] WriteBytes)
                {
                    if(hPortHanle!=INVALID_HANDLE_VALUE)
                    {
                        int BytesWritten = 0;
                        WriteFile(hPortHanle,WriteBytes,WriteBytes.Length, ref BytesWritten,0);
                    }
                    else
                    {
                        throw(new ApplicationException("Порт не был открыт"));
                    }
                }

            //Описание констант Win32 API
            private const uint GENERIC_READ = 0x80000000;
            private const uint GENERIC_WRITE = 0x40000000;
            private const int OPEN_EXISTING = 3;
            private const int INVALID_HANDLE_VALUE = -1;

            [StructLayout(LayoutKind.Sequential)]
            public struct DCB
            {
////////////////////////////////на след странице
lexluter1988 вне форума Ответить с цитированием
Старый 15.05.2010, 16:10   #3
lexluter1988
Пользователь
 
Аватар для lexluter1988
 
Регистрация: 20.04.2010
Сообщений: 47
По умолчанию

Код:
 
                public int DCBlength;
                public int BaudRate;
                /*
                public int fBinary;
                public int fParity;
                public int fOutxCtsFlow;
                public int fOutxDsrFlow;
                public int fDtrControl;
                public int fDsrSensitivity;
                public int fTXContinueOnXoff;
                public int fOutX;
                public int fInX;
                public int fErrorChar;
                public int fNull;
                public int fRtsControl;
                public int fAbortOnError;
                public int fDummy2;
                */
                public uint flags;
                public ushort wReserved;
                public ushort XonLim;
                public ushort XoffLim;
                public byte ByteSize;
                public byte Parity;
                public byte StopBits;
                public char XonChar;
                public char XoffChar;
                public char ErrorChar;
                public char EofChar;
                public char EvtChar;
                public ushort wReserved1;
            }
            [DllImport("kernel32.dll")]
            private static extern int CreateFile(
                string lpFileName,
                uint dwDesiredAccess,
                int dwShareMode,
                int lpSecurityAttributes,
                int dwCreationDisposition,
                int dwFlagsAndAttributes,
                int hTemlateFile
                );
            [DllImport("kernel32.dll")]
            private static extern bool GetCommState (
                int hFile,      //дескриптор файла(порта)
                ref DCB lpDCB   //структура DCB
            );
            [DllImport("kernel32.dll")]
            private static extern bool SetCommState (
                int hFile,      //дескриптор файла(порта)
                ref DCB lpDCB   //структура DCB
            );
            [DllImport("kernel32.dll")]
            private static extern bool ReadFile (
                int hFile,          //дескриптор файла(порта)
                byte[] lpBuffer,    //буфер
                int nNumberOfBytesToRead,   //размер буфера
                ref int lpNumberOfBytesRead,//реально прочитано
                int lpOverlapped    // 0 для синхронных операций
             );
            [DllImport("kernel32.dll")]
            private static extern bool WriteFile (
                int hFile,          //дескриптор файла(порта)
                byte[] lpBuffer,    //буфер
                int nNumberOfBytesToWrite,   //размер буфера
                ref int lpNumberOfBytesWritten,//реально прочитано
                int lpOverlapped    // 0 для синхронных операций
            );
            [DllImport("kernel32.dll")]
            private static extern bool CloseHandle(
                int hObject //дескриптор файла(порта)
            );
        }

        private void button1_Click(object sender, EventArgs e)
        {
            CommPort port = new CommPort(4, 9600, 8, Parity.No, StopBits.Bits1);
            if (port.Open())
            {
                byte[] data = port.Read(100);
                foreach (byte b in data)
                {
                    listBox1.Items.Add(string.Format("{0}", b));
                }
                port.Close();
            }
            else
            {
                MessageBox.Show("Порт не открыт!Открой порт!!!");
            }

        }





        
    }
}
lexluter1988 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа c COM-портом doniyor Общие вопросы Delphi 12 27.07.2009 11:16
Работа с COM-портом jovanny Помощь студентам 2 03.05.2009 18:06
Работа с COM портом hoba Общие вопросы Delphi 3 20.11.2008 03:39
Как вызвать системный диалог настройки даты и времени? И возможно ли это вообще? Bill Gates Общие вопросы Delphi 2 05.01.2008 21:08