C#
От: AC1D  
Дата: 13.04.04 17:02
Оценка:
Приветвую читующий
Вот решил поизучать VisualStudio,книжки читаю , все дела

Хотелось бы задать несколько вопросиков:

1.) Ктонить писал чтонить для работы с последовательным портом на C#?
Есть ли какие нить компонентики\классы? Надо всеголишь получить данные.

2.) Oracle — соединялись? Не каких подводных камней? Там я смотрю какието компонентики припасены?

Не пинайте, только начал учить
... << RSDN@Home 1.1.3 stable >>
Re: C#
От: Igor Trofimov  
Дата: 13.04.04 18:05
Оценка: 3 (1)
ACD>1.) Ктонить писал чтонить для работы с последовательным портом на C#?
ACD>Есть ли какие нить компонентики\классы? Надо всеголишь получить данные.

Поищи на www.codeproject.com — там видел что-то симпатичное на эту тему.

ACD>2.) Oracle — соединялись? Не каких подводных камней? Там я смотрю какието компонентики припасены?


Есть провайдер от MS, есть сторонние провайдеры. Камней хватает везде, как обычно
Re: C#
От: Konstantin Nikolaenko  
Дата: 13.04.04 18:54
Оценка: 6 (2)
Здравствуйте, AC1D, Вы писали:


ACD>1.) Ктонить писал чтонить для работы с последовательным портом на C#?

ACD>Есть ли какие нить компонентики\классы? Надо всеголишь получить данные.


Была статья в MSDN — http://msdn.microsoft.com/msdnmag/issues/02/10/NETSerialComm/default.aspx

Там же есть исходники dll-ки и пример. Сам пользуюсь этой dll-кой — работает
Re: C#
От: vdimas Россия  
Дата: 13.04.04 19:00
Оценка: 24 (2)
Здравствуйте, AC1D, Вы писали:

ACD>1.) Ктонить писал чтонить для работы с последовательным портом на C#?

ACD>Есть ли какие нить компонентики\классы? Надо всеголишь получить данные.

Есть очень полезная иерархия в дотнете — корнем от Stream.
Есть класс FileStream, но, к сожалению, им невозможно открыть девайс.
Поэтому накатал свой простенький класс для доступа к девайсам (пару вещей пришлось делать напрямую через WinAPI):

DeviceStream.cs
using System;
using System.IO;
using System.Runtime.InteropServices;

namespace DriverLib {

    public class DeviceStream : Stream {

        private IntPtr handle;

        public DeviceStream(IntPtr handle) {
            this.handle=handle;
        }

        public DeviceStream(string path) {
            WinAPI.Check(handle = WinAPI.CreateFileA(path, (uint)FileAccess.ReadWrite, 
                            (uint)FileShare.ReadWrite, nullPtr, 3, 0, nullPtr) );
                }    
        
        public IntPtr Handle { get { return this.handle; } }

        public override void Flush() { }
    
        public override bool CanRead { get { return true; } }
    
        public override bool CanSeek { get { return false; } }
    
        public override bool CanWrite { get { return true; } }
    
        public override long Length { get { return 0; } }
    
        static Exception canNotSeek = new IOException("Can not seek in driver stream.");

        public override long Position {
            get { return 0; }
            set { throw canNotSeek; }
        }
    
        public override long Seek(long offset, SeekOrigin origin) {
            throw canNotSeek;
        }
    
        public override void SetLength(long value) {
            throw canNotSeek;
        }
    

        private static IntPtr nullPtr=(IntPtr)0;

        public override int Read(byte[] buffer, int offset, int count)
        {
            if (offset+count>buffer.Length) 
                throw new IndexOutOfRangeException();
            
            unsafe {
                fixed(byte* buf=buffer) {
                    byte* buf1=buf+offset;
                    uint readed;
                    WinAPI.Check(WinAPI.ReadFile(handle, buf1, (uint)count, &readed, nullPtr)!=0);
                    return (int)readed;
                }
            }
        }


        public override void Write(byte[] buffer, int offset, int count)
        {
            if (offset+count>buffer.Length) 
                throw new IndexOutOfRangeException();

            unsafe {
                fixed(byte* buf=buffer) {
                    byte* buf1=buf+offset;
                    uint writed;
                    WinAPI.Check(WinAPI.WriteFile(handle, buf1, (uint)count, &writed, nullPtr)!=0);
                }
            }
        }
    
        public void Dispose() {
            if (handle!=(IntPtr)0) 
                WinAPI.CloseHandle(handle);
        }
    }
}


WinAPI.cs
using System;
using System.Runtime.InteropServices;

namespace DriverLib {

    public sealed class WinAPI {
        // private constructor
        private WinAPI() {}

        /// <summary>
        /// WinAPI INVALID_HANDLE value
        /// </summary>
        public static readonly IntPtr InvalidHandle = new IntPtr(- 1L);

        [DllImport("Kernel32.dll")]
        [return : MarshalAs(UnmanagedType.Error)]
        public static extern ErrorCode GetLastError();

        /// <summary>
        /// Win32 API error codes.
                /// to be continued ...
        /// </summary>
        public enum ErrorCode {
            NO_ERROR = 0, 
            ERROR_NO_MORE_ITEMS = 259
        }


        /// <summary>
        /// Checks last Win32 API error.
        /// Throws an WinAPI.Exception
        /// </summary>
        public static void CheckLastError() {
            Check(GetLastError());
        }

        public static void Check(ErrorCode err)    {
            if (err != ErrorCode.NO_ERROR) 
                throw new Exception("System error #"+err);
                // TODO: add more information in error description
        }

        /// <summary>
        /// Throws exception if false
        /// </summary>
        public static void Check(bool result) {
            if (result == false) 
                CheckLastError();
        }

        /// <summary>
        /// BOOL WinAPI result checking
        /// </summary>
        public static void Check(uint result) {
            Check(result != 0);
        }

        /// <summary>
        /// Handle check for INVALID_HANDLE
        /// </summary>
        public static void Check(IntPtr result) {
            Check(result != InvalidHandle);
        }

        /// <summary>
        /// API exception
        /// </summary>
        public class Exception : System.SystemException    {
            public Exception() { }

            public Exception(string text) : base(text) { }

            public Exception(string text, Exception innerException) 
                : base(text, innerException) { }
        }

        [DllImport("Kernel32.dll")]
        protected static extern IntPtr CreateFileA(
            [MarshalAs(UnmanagedType.LPStr)]
            String lpFileName, 
            uint dwDesiredAccess, 
            uint dwShareMode, 
            IntPtr lpSecurityAttributes, 
            uint dwCreationDisposition, 
            uint dwFlagsAndAttributes, 
            IntPtr hTemplateFile);

        [DllImport("Kernel32.dll")]
        public unsafe static extern uint ReadFile(
            IntPtr hFile,
            byte* lpBuffer,
            uint nNumberOfBytesToRead,
            uint* lpNumberOfBytesRead,
            IntPtr lpOverlapped);

        [DllImport("Kernel32.dll")]
        public unsafe static extern uint WriteFile(
            IntPtr hFile,
            byte* lpBuffer,
            uint nNumberOfBytesToWrite,
            uint* lpNumberOfBytesWritten,
            IntPtr lpOverlapped);

        [DllImport("Kernel32.dll")]
        public static extern uint CloseHandle(IntPtr hObject);

    }
}


а теперь весело так все это используем:
    DeviceStream comPort= new DeviceStream("COM1:9600,n,8,1,ds");

    try {
        comPort.Open();
        comPort.WriteByte(0x7); // write something to port
        comPort.WriteByte(0xA); 
    } catch (Exception ex) {
        MessageBox.Show(ex.ToString());
    } finally {
        comPort.Close();
        }
Re[2]: C#
От: Repz  
Дата: 16.11.05 04:28
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, AC1D, Вы писали:


ACD>>1.) Ктонить писал чтонить для работы с последовательным портом на C#?

ACD>>Есть ли какие нить компонентики\классы? Надо всеголишь получить данные.

V>Есть очень полезная иерархия в дотнете — корнем от Stream.

V>Есть класс FileStream, но, к сожалению, им невозможно открыть девайс.
V>Поэтому накатал свой простенький класс для доступа к девайсам (пару вещей пришлось делать напрямую через WinAPI):

Здравствуйте, как можно переделать вышеописанный пример для работы с LPT портом ?
Re[3]: C#
От: vdimas Россия  
Дата: 16.11.05 05:25
Оценка:
Здравствуйте, Repz, Вы писали:


R>Здравствуйте, как можно переделать вышеописанный пример для работы с LPT портом ?


DeviceStream comPort= new DeviceStream("LPT1");

однако, это немного неправильно. Дело в том, что список устройст надо получать по енумерации, и как аргумент конструктора передавать не строку "LPT1", а конкретное найденое устройство (строка идентификации весьма длинная и корявая).


Вот тут моя либа по енумерации устройсств:
http://www.rsdn.ru/File/21096/driverlib.zip

Для того, чтобы понять как она работает неплохо предварительно разобраться с классами устройств и интерфейсами. Используй либу как заготовку. Там можно добавлять GUID-ы требуемых классов устройств и интерфейсов.

Зато подобным образом можно открыть как файл любое устройство, USB и т.д.

Так же просмотри IOCTL, и можешь расширить либу по аналогии (отсутствует в либе, но может потребоваться для управления режимами устройств). Если что толковое получиться — не забудь выложить.

Удачи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.