Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: как работать с UART в C#?  (Прочитано 5897 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Andry10
Гость
« : 20-03-2005 17:21 » 

Подскажите пожалуйста, как организовать работу с последовательным портом в C# программе? Улыбаюсь Улыбаюсь Улыбаюсь
Записан
xelos
Гость
« Ответ #1 : 21-03-2005 09:16 » 

в версиях FrameWork 1.0-1.1 только через кернел виндоуз... в версии 2.0 будет специальный нэймспейс System.IO
Записан
xelos
Гость
« Ответ #2 : 21-03-2005 09:20 » 

как пример, импорты и константы кернела:
Код:
#region Constants

// Constants pris de WINERROR.H
internal const UInt32 ERROR_FILE_NOT_FOUND = 2;
internal const UInt32 ERROR_ACCESS_DENIED = 5;
internal const UInt32 ERROR_IO_PENDING = 997;

// Constants pris de WINBASE.H
internal const Int32 INVALID_HANDLE_VALUE = -1;
internal const UInt32 FILE_FLAG_OVERLAPPED = 0x40000000; //dwFlagsAndAttributes
internal const UInt32 OPEN_EXISTING = 3; //dwCreationDisposition

// Constants pris de WINNT.H
internal const UInt32 GENERIC_READ = 0x80000000; //dwDesiredAccess
internal const UInt32 GENERIC_WRITE = 0x40000000;
internal const UInt32 READ_WRITE = GENERIC_READ | GENERIC_WRITE;
#endregion

#region Imports
/// <summary>
/// Creer ou ouvre l'objet et retourne un handle, qui peut кtre utilisй
/// pour acceder а l'objet
/// </summary>
[DllImport("kernel32.dll", SetLastError=true)]
private static extern IntPtr CreateFile
(
String lpFileName,
UInt32 dwDesiredAccess,
UInt32 dwShareMode,
IntPtr lpSecurityAttributes,
UInt32 dwCreationDisposition,
UInt32 dwFlagsAndAttributes,
IntPtr hTemplateFile
);

/// <summary>
/// Ferme le handle ouvert de l'objet
/// </summary>
[DllImport("kernel32.dll")]
private static extern Boolean CloseHandle
(
IntPtr hObject
);

/// <summary>
/// Lire les donnйes depuis un stream. Commence а la position
/// indiquйe par le pointeur de stream.
/// </summary>
[DllImport("kernel32.dll", SetLastError=true)]
private static extern Boolean ReadFile
(
IntPtr hFile,
[Out] Byte[] lpBuffer,
UInt32 nNumberOfBytesToRead,
out UInt32 nNumberOfBytesRead,
IntPtr lpOverlapped
);

/// <summary>
/// Ecrire les donnйes dans un stream.
/// </summary>
[DllImport("kernel32.dll", SetLastError=true)]
private static extern Boolean WriteFile
(
IntPtr fFile,
Byte[] lpBuffer,
UInt32 nNumberOfBytesToWrite,
out UInt32 lpNumberOfBytesWritten,
IntPtr lpOverlapped
);

#endregion
потом с этими функциями работаешь как в винде:
Код:
/// <summary>
/// Ecrire les donnйes dans le port
/// </summary>
/// <param name="buf">Tampon а йcrire</param>
/// <param name="nToSend">Numиro de byte а йcrire</param>
/// <param name="nSent">Nombre d'octets envoyйs</param>
/// <param name="ovlap">Overlapped</param>
/// <returns>true si succes, false sinon</returns>
public bool Write(byte[] buf, uint nToSend, out uint nSent)
{

// Send data buffer.
bool status = WriteFile(this.port, buf, nToSend, out nSent, IntPtr.Zero);
if (!status)
{
this.fault="Error WriteFile(). Error code: " + Marshal.GetLastWin32Error().ToString();
}
else
{
this.fault="OK";
}

return status;
}
« Последнее редактирование: 20-12-2007 18:33 от Алексей1153++ » Записан
Andry10
Гость
« Ответ #3 : 23-03-2005 07:40 » 

Спасибо, попробую.
Записан
Alf
Гость
« Ответ #4 : 23-03-2005 07:52 » 

Для управления модемом из программы на C# использовал ActiveX компонент MSCOMM32. Поскольку СОМ-порт - устройство весьма медленное, влияния накладных расходов при совместной работе кода managed и COM не обнаружил.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines