Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 31.10.2007
Сообщений: 26

Работа с последовательным портом.

31.10.2007, 16:04. Показов 5978. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Коллеги...подскажите пожалуйста.Как из VS2005 в C#,работать споследовательным портом,если можно по-подробней.
Может у кого нить есть хорошее описание пространств имен System.IO.Ports ? а то никакой информации не нашел,желательно с примерами.
Проблема в общем вот какая, нужно написать программу на C# для работы с промышленным контроллером нашего
производства(модуль вода -вывода).Этот модуль работает в протоколе modbus rtu.Програма должна выполнять его первоначальную настройку.То есть подключаем его к COM порту компа,запускаем прогу и настраиваем...меняем уставки
вводим в ячейки памяти контроллера необходимые значения,а так же считываем с него информацию разного рода из его ячеек.Все это надо делать через последовательные порт,а как с ним работать в C#???
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.10.2007, 16:04
Ответы с готовыми решениями:

Работа с последовательным портом с помощью SerialPort
Здравствуйте! помогите кто может! Надо написать программу, которая отслеживала бы одиночное нажатие кнопки подключенной к ком-порту, если...

С# работа с COM портом
Всем доброго времени суток, нужна ваша помощь. Есть девайсина, которая подключена к COM1. Нужно автоматизировать ее работу...

работа с COM-портом
Может ли кто-нибудь подсказать библиотеку для работы с com (или lpt) портом на си шарпе. Мне нужно считать сколько единичек пришло за...

2
0 / 0 / 0
Регистрация: 31.10.2007
Сообщений: 26
31.10.2007, 16:07  [ТС]
и еще...может кто вообще уже с таким случаем сталкивался....именно с контроллером работал...то примеры кода C# мне очень бы помогли.
0
Администратор
 Аватар для mik-a-el
87808 / 53129 / 249
Регистрация: 10.04.2006
Сообщений: 13,760
31.10.2007, 16:25
Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

Пример:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
using System;
using System.Windows.Forms;
using System.IO;
using System.Data;
using System.Runtime.InteropServices;
 
public int Download(byte[] Buffer, int Length)
  {
   IntPtr hPort=(IntPtr)Win32Com.INVALID_HANDLE_VALUE;
   IntPtr ptrUWO = IntPtr.Zero;
   Win32Com.DCB PortDCB = new Win32Com.DCB();
   Win32Com.COMMTIMEOUTS CommTimeouts = new Win32Com.COMMTIMEOUTS();
    
   
   hPort = Win32Com.CreateFile("COM1:", Win32Com.GENERIC_READ | Win32Com.GENERIC_WRITE, 0, IntPtr.Zero,
     Win32Com.OPEN_EXISTING, 0, IntPtr.Zero);
   
    if (hPort == (IntPtr)Win32Com.INVALID_HANDLE_VALUE) 
    {
     Put_Error("Error:COM1 port could not be opened!");
     return -1;
    }
    else  
    {//порт не занят
     Win32Com.GetCommState(hPort,ref PortDCB);
     //заполняем нужные поля
     PortDCB.BaudRate=38400;//скорость передачи
     PortDCB.ByteSize = 8;//размер бита
     PortDCB.Parity = 0;//no parity
     PortDCB.StopBits = 0; //1 stopbit
     if (!Win32Com.SetCommState(hPort, ref PortDCB))
     {
      Put_Error("Error:COM1 port could not be opened!");
      return -1;
     }
     uint sent = 0;
     if((!Win32Com.WriteFile(hPort,Buffer,(uint)Length,out sent,ptrUWO))||(Length!=(int)sent))
     
    {
      Put_Error("Error:Can't write file into COM1 port!");
      return -1;
     
     }
     //закрываем порт
     Win32Com.CancelIo(hPort);
     if (!Win32Com.CloseHandle(hPort))
     {
      Put_Error("Warning:Can't close COM1 port!");
      return -1;
     
     }
     
    }
 
   
   return 1;
  }
 }
 internal class Win32Com 
 {
  /// <summary>
  /// Opening Testing and Closing the Port Handle.
  /// </summary>
  [DllImport("kernel32.dll", SetLastError=true)]
  internal static extern IntPtr CreateFile(String lpFileName, UInt32 dwDesiredAccess, UInt32 dwShareMode,
   IntPtr lpSecurityAttributes, UInt32 dwCreationDisposition, UInt32 dwFlagsAndAttributes,
   IntPtr hTemplateFile);
  //Constants for errors:
  internal const UInt32 ERROR_FILE_NOT_FOUND = 2;
  internal const UInt32 ERROR_INVALID_NAME = 123;
  internal const UInt32 ERROR_ACCESS_DENIED = 5;
  internal const UInt32 ERROR_IO_PENDING = 997;
  //Constants for return value:
  internal const Int32 INVALID_HANDLE_VALUE = -1;
  //Constants for dwFlagsAndAttributes:
  internal const UInt32 FILE_FLAG_OVERLAPPED = 0x40000000;
  //Constants for dwCreationDisposition:
  internal const UInt32 OPEN_EXISTING = 3;
  //Constants for dwDesiredAccess:
  internal const UInt32 GENERIC_READ = 0x80000000;
  internal const UInt32 GENERIC_WRITE = 0x40000000;
  [DllImport("kernel32.dll")]
  internal static extern Boolean CloseHandle(IntPtr hObject);
  /// <summary>
  /// Manipulating the communications settings.
  /// </summary>
  [DllImport("kernel32.dll")]
  internal static extern Boolean GetCommState(IntPtr hFile, ref DCB lpDCB);
  [DllImport("kernel32.dll")]
  internal static extern Boolean GetCommTimeouts(IntPtr hFile, out COMMTIMEOUTS lpCommTimeouts);
  [DllImport("kernel32.dll")]
  internal static extern Boolean BuildCommDCBAndTimeouts(String lpDef, ref DCB lpDCB, ref COMMTIMEOUTS lpCommTimeouts);
  [DllImport("kernel32.dll")]
  internal static extern Boolean SetCommState(IntPtr hFile, [In] ref DCB lpDCB);
  [DllImport("kernel32.dll")]
  internal static extern Boolean SetCommTimeouts(IntPtr hFile, [In] ref COMMTIMEOUTS lpCommTimeouts);
  [DllImport("kernel32.dll")]
  internal static extern Boolean SetupComm(IntPtr hFile, UInt32 dwInQueue, UInt32 dwOutQueue);
  [StructLayout( LayoutKind.Sequential )] internal struct COMMTIMEOUTS 
  {
   //JH1.1: Changed Int32 to UInt32 to allow setting to MAXDWORD
   internal UInt32 ReadIntervalTimeout;
   internal UInt32 ReadTotalTimeoutMultiplier;
   internal UInt32 ReadTotalTimeoutConstant;
   internal UInt32 WriteTotalTimeoutMultiplier;
   internal UInt32 WriteTotalTimeoutConstant;
  }
  //JH1.1: Added to enable use of "return immediately" timeout.
  internal const UInt32 MAXDWORD = 0xffffffff;
  [StructLayout( LayoutKind.Sequential )] internal struct DCB 
  {
   internal Int32 DCBlength;
   internal Int32 BaudRate;
   internal Int32 PackedValues;
   internal Int16 wReserved;
   internal Int16 XonLim;
   internal Int16 XoffLim;
   internal Byte  ByteSize;
   internal Byte  Parity;
   internal Byte  StopBits;
   internal Byte XonChar;
   internal Byte XoffChar;
   internal Byte ErrorChar;
   internal Byte EofChar;
   internal Byte EvtChar;
   internal Int16 wReserved1;
   internal void init(bool parity, bool outCTS, bool outDSR, int dtr, bool inDSR, bool txc, bool xOut,
    bool xIn, int rts)
   {
    DCBlength = 28; PackedValues = 0x8001;
    if (parity) PackedValues |= 0x0002;
    if (outCTS) PackedValues |= 0x0004;
    if (outDSR) PackedValues |= 0x0008;
    PackedValues |= ((dtr & 0x0003) << 4);
    if (inDSR) PackedValues |= 0x0040;
    if (txc) PackedValues |= 0x0080;
    if (xOut) PackedValues |= 0x0100;
    if (xIn) PackedValues |= 0x0200;
    PackedValues |= ((rts & 0x0003) << 12);
   }
  }
  /// <summary>
  /// Reading and writing.
  /// </summary>
  [DllImport("kernel32.dll", SetLastError=true)]
  internal static extern Boolean WriteFile(IntPtr fFile, Byte[] lpBuffer, UInt32 nNumberOfBytesToWrite,
   out UInt32 lpNumberOfBytesWritten, IntPtr lpOverlapped);
  [StructLayout( LayoutKind.Sequential )] internal struct OVERLAPPED 
  {
   internal UIntPtr Internal;
   internal UIntPtr InternalHigh;
   internal UInt32 Offset;
   internal UInt32 OffsetHigh;
   internal IntPtr hEvent;
  }
  [DllImport("kernel32.dll")]
  internal static extern Boolean SetCommMask(IntPtr hFile, UInt32 dwEvtMask);
  // Constants for dwEvtMask:
  internal const UInt32 EV_RXCHAR = 0x0001;
  internal const UInt32 EV_RXFLAG = 0x0002;
  internal const UInt32 EV_TXEMPTY = 0x0004;
  internal const UInt32 EV_CTS = 0x0008;
  internal const UInt32 EV_DSR = 0x0010;
  internal const UInt32 EV_RLSD = 0x0020;
  internal const UInt32 EV_BREAK = 0x0040;
  internal const UInt32 EV_ERR = 0x0080;
  internal const UInt32 EV_RING = 0x0100;
  internal const UInt32 EV_PERR = 0x0200;
  internal const UInt32 EV_RX80FULL = 0x0400;
  internal const UInt32 EV_EVENT1 = 0x0800;
  internal const UInt32 EV_EVENT2 = 0x1000;
  [DllImport("kernel32.dll", SetLastError=true)]
  internal static extern Boolean WaitCommEvent(IntPtr hFile, IntPtr lpEvtMask, IntPtr lpOverlapped);
  [DllImport("kernel32.dll")]
  internal static extern Boolean CancelIo(IntPtr hFile);
  
  [DllImport("kernel32.dll", SetLastError=true)]
  internal static extern Boolean ReadFile(IntPtr hFile, [Out] Byte[] lpBuffer, UInt32 nNumberOfBytesToRead,
   out UInt32 nNumberOfBytesRead, IntPtr lpOverlapped);
  [DllImport("kernel32.dll")]
  internal static extern Boolean TransmitCommChar(IntPtr hFile, Byte cChar);
  /// <summary>
  /// Control port functions.
  /// </summary>
  [DllImport("kernel32.dll")]
  internal static extern Boolean EscapeCommFunction(IntPtr hFile, UInt32 dwFunc);
  // Constants for dwFunc:
  internal const UInt32 SETXOFF = 1;
  internal const UInt32 SETXON = 2;
  internal const UInt32 SETRTS = 3;
  internal const UInt32 CLRRTS = 4;
  internal const UInt32 SETDTR = 5;
  internal const UInt32 CLRDTR = 6;
  internal const UInt32 RESETDEV = 7;
  internal const UInt32 SETBREAK = 8;
  internal const UInt32 CLRBREAK = 9;
  
  [DllImport("kernel32.dll")]
  internal static extern Boolean GetCommModemStatus(IntPtr hFile, out UInt32 lpModemStat);
  // Constants for lpModemStat:
  internal const UInt32 MS_CTS_ON = 0x0010;
  internal const UInt32 MS_DSR_ON = 0x0020;
  internal const UInt32 MS_RING_ON = 0x0040;
  internal const UInt32 MS_RLSD_ON = 0x0080;
  /// <summary>
  /// Status Functions.
  /// </summary>
  [DllImport("kernel32.dll", SetLastError=true)]
  internal static extern Boolean GetOverlappedResult(IntPtr hFile, IntPtr lpOverlapped,
   out UInt32 nNumberOfBytesTransferred, Boolean bWait);
  [DllImport("kernel32.dll")]
  internal static extern Boolean ClearCommError(IntPtr hFile, out UInt32 lpErrors, IntPtr lpStat);
  [DllImport("kernel32.dll")]
  internal static extern Boolean ClearCommError(IntPtr hFile, out UInt32 lpErrors, out COMSTAT cs);
  //Constants for lpErrors:
  internal const UInt32 CE_RXOVER = 0x0001;
  internal const UInt32 CE_OVERRUN = 0x0002;
  internal const UInt32 CE_RXPARITY = 0x0004;
  internal const UInt32 CE_FRAME = 0x0008;
  internal const UInt32 CE_BREAK = 0x0010;
  internal const UInt32 CE_TXFULL = 0x0100;
  internal const UInt32 CE_PTO = 0x0200;
  internal const UInt32 CE_IOE = 0x0400;
  internal const UInt32 CE_DNS = 0x0800;
  internal const UInt32 CE_OOP = 0x1000;
  internal const UInt32 CE_MODE = 0x8000;
  [StructLayout( LayoutKind.Sequential )] internal struct COMSTAT 
  {
   internal const uint fCtsHold = 0x1;
   internal const uint fDsrHold = 0x2;
   internal const uint fRlsdHold = 0x4;
   internal const uint fXoffHold = 0x8;
   internal const uint fXoffSent = 0x10;
   internal const uint fEof = 0x20;
   internal const uint fTxim = 0x40;
   internal UInt32 Flags;
   internal UInt32 cbInQue;
   internal UInt32 cbOutQue;
  }
  [DllImport("kernel32.dll")]
  internal static extern Boolean GetCommProperties(IntPtr hFile, out COMMPROP cp);
  [StructLayout( LayoutKind.Sequential )] internal struct COMMPROP
  {
   internal UInt16 wPacketLength; 
   internal UInt16 wPacketVersion; 
   internal UInt32 dwServiceMask; 
   internal UInt32 dwReserved1; 
   internal UInt32 dwMaxTxQueue; 
   internal UInt32 dwMaxRxQueue; 
   internal UInt32 dwMaxBaud; 
   internal UInt32 dwProvSubType; 
   internal UInt32 dwProvCapabilities; 
   internal UInt32 dwSettableParams; 
   internal UInt32 dwSettableBaud; 
   internal UInt16 wSettableData; 
   internal UInt16 wSettableStopParity; 
   internal UInt32 dwCurrentTxQueue; 
   internal UInt32 dwCurrentRxQueue; 
   internal UInt32 dwProvSpec1; 
   internal UInt32 dwProvSpec2; 
   internal Byte wcProvChar; 
  }
}
Еще можно почитать там:
http://msdn.microsoft.com/msdn... fault.aspx
http://forums.microsoft.com/MS... 3&SiteID=1
http://www.devhood.com/tutoria... ial_id=320
http://msmvps.com/blogs/coad/a... -.NET.aspx
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.10.2007, 16:25
Помогаю со студенческими работами здесь

Работа с usb портом
Как записать/прочитать данные с USB-порта, как определить к какому из портов подключено устройство? Правильно ли я понимаю, что...

Работа с LPT портом.
Добрый день. Необходимо написать программу которая бы поочередно посылала импульсы на 2 (D0) 3(D1) 4(D2) 8(D6) пины. Гугл выдал что...

Работа с одним com-портом с нескольких форм
Доброго времени суток. Подскажите, пожалуйста, как работать с одним com-портом с нескольких форм приложения. Спасибо.

Работа с USB портом. Прослушка порта
Здравствуйте. Минимальная задача состоит в том что бы сделать трассировку порта + проброску данных, т.е. условно есть порт USB1 и USB2, я...

Работа с COM-портом, с течением времени данные искажаются
Доброго времени суток! Потребовалось написать небольшую программу для работы с COM-портом, которая принимает от микроконтроллера...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru