Здравствуйте, 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();
}
Здравствуйте, AC1D, Вы писали:
ACD>1.) Ктонить писал чтонить для работы с последовательным портом на C#?
ACD>Есть ли какие нить компонентики\классы? Надо всеголишь получить данные.
Была статья в MSDN —
http://msdn.microsoft.com/msdnmag/issues/02/10/NETSerialComm/default.aspx
Там же есть исходники dll-ки и пример. Сам пользуюсь этой dll-кой — работает
ACD>1.) Ктонить писал чтонить для работы с последовательным портом на C#?
ACD>Есть ли какие нить компонентики\классы? Надо всеголишь получить данные.
Поищи на
www.codeproject.com — там видел что-то симпатичное на эту тему.
ACD>2.) Oracle — соединялись? Не каких подводных камней? Там я смотрю какието компонентики припасены?
Есть провайдер от MS, есть сторонние провайдеры. Камней хватает везде, как обычно
Приветвую читующий
Вот решил поизучать VisualStudio,книжки читаю , все дела
Хотелось бы задать несколько вопросиков:
1.) Ктонить писал чтонить для работы с последовательным портом на C#?
Есть ли какие нить компонентики\классы? Надо всеголишь получить данные.
2.) Oracle — соединялись? Не каких подводных камней? Там я смотрю какието компонентики припасены?
Не пинайте, только начал учить
... << RSDN@Home 1.1.3 stable >>
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, AC1D, Вы писали:
ACD>>1.) Ктонить писал чтонить для работы с последовательным портом на C#?
ACD>>Есть ли какие нить компонентики\классы? Надо всеголишь получить данные.
V>Есть очень полезная иерархия в дотнете — корнем от Stream.
V>Есть класс FileStream, но, к сожалению, им невозможно открыть девайс.
V>Поэтому накатал свой простенький класс для доступа к девайсам (пару вещей пришлось делать напрямую через WinAPI):
Здравствуйте, как можно переделать вышеописанный пример для работы с LPT портом ?
Здравствуйте, Repz, Вы писали:
R>Здравствуйте, как можно переделать вышеописанный пример для работы с LPT портом ?
DeviceStream comPort= new DeviceStream("LPT1");
однако, это немного неправильно. Дело в том, что список устройст надо получать по енумерации, и как аргумент конструктора передавать не строку "LPT1", а конкретное найденое устройство (строка идентификации весьма длинная и корявая).
Вот тут моя либа по енумерации устройсств:
http://www.rsdn.ru/File/21096/driverlib.zip
Для того, чтобы понять как она работает неплохо предварительно разобраться с классами устройств и интерфейсами. Используй либу как заготовку. Там можно добавлять GUID-ы требуемых классов устройств и интерфейсов.
Зато подобным образом можно открыть как файл любое устройство, USB и т.д.
Так же просмотри IOCTL, и можешь расширить либу по аналогии (отсутствует в либе, но может потребоваться для управления режимами устройств). Если что толковое получиться — не забудь выложить.
Удачи.