![]() |
![]() |
![]() |
|
SerialPort (C#) | ☑ | ||
---|---|---|---|---|
0
Дуб
25.01.08
✎
16:07
|
В очередной раз туплю, но может кто подскажет... В C# можно добавить на форму элемент System.IO.Ports.SerialPort.. Так вот: выставляю имя порта и скорость, открываю (пока всё нормально).. А как прочесть данные - не знаю :(. Там параметров туча. Проблема в том, что интересующий девайс подключён к другой машине (на которой среды разработки нет, Отладчиком не пройти), и событие по порту генерится не особо часто (это АТС, запись - при завершении звонка). Все параметры выводить в текстовое сообщение - вши съедят. Подскажите, плз, параметры для чтения..
|
|||
1
Salvador Limones
25.01.08
✎
16:13
|
Так используй евенты, типа OnDataReceived
|
|||
2
Дуб
25.01.08
✎
16:31
|
(1) Пробую.. Так а толку? Ну событие я отловлю, а дальше? Читать-то что?
|
|||
3
Salvador Limones
25.01.08
✎
16:32
|
(2) В процедура евента: serialPort1.ReadLine() либо ReadChar()
|
|||
4
Дуб
28.01.08
✎
10:25
|
(3) Извини, до машины с портом только сейчас добрался. При ReadLine() (равно как и при ReadChar()) задумывается до невозможности. Такое чувство, что читает всё подряд, пока есть что читать. Ни разу не дождался завершения, прерывал процесс.
MyCOM.PortName = SelectPort.Text; MyCOM.BaudRate = COM_Speed(Speed.Text); MyCOM.DataBits = 8; MyCOM.Parity = System.IO.Ports.Parity.None; MyCOM.StopBits = System.IO.Ports.StopBits.One; MyCOM.Open(); Затем System.IO.StreamWriter T = new System.IO.StreamWriter(@"C:\com_read.txt"); T.WriteLine(@"" + MyCOM.ReadLine()); T.Close(); MyCOM.Close(); Туплю, но поделать ничего не могу. |
|||
5
Salvador Limones
28.01.08
✎
10:33
|
Тогда не знаю.
Смотря, что там у тебя на КОМ поступает. Пробуй просто Read в буфер. |
|||
6
Дуб
28.01.08
✎
10:39
|
(5) И дальше чего с буфером делать-то? Я ж точку останова поставить не могу :(. А Read() - он же параметров, вроде, требует (char[] buffer, int offset, int count)? C ними что делать?
|
|||
7
Salvador Limones
28.01.08
✎
10:52
|
(6) Глянь, вдруг поможет: http://www.gotdotnet.ru/Forums/Common/306132.aspx
|
|||
8
Hadgehogs
28.01.08
✎
10:57
|
(робко так и неуверено)
А может проще через API? CreateFile() SetCommTimeouts() ReadFile() CloseHandle() |
|||
9
Дуб
28.01.08
✎
11:03
|
(7) Смотрю, спасибо.. (8) Т.е. обращаться к COM порту, как к файлу? Типа, виндовый рудимент? Если так - то можно, только нафига они тогда контрол на форму предложили?.. Попробую.
|
|||
10
Hadgehogs
28.01.08
✎
11:07
|
100% ваш контрол так и обращается.
Хрен ему WinNT позволит как иначе... Драйвер для одного этого ставить некошерно. Да, еще чтобы нормальные Event -ы были надо еще SetTimer() KillTimer() |
|||
11
Hadgehogs
28.01.08
✎
11:09
|
Я это не разу не пробовал. Но инстинтк говорит, что вроде так.
|
|||
12
Дуб
28.01.08
✎
11:10
|
(10) Это у меня второй загиб мозга чичас вызовет :). Ведь сидел - никого не трогал, а тут этот порт.. Спасибо. Буду биться.
|
|||
13
Hadgehogs
28.01.08
✎
11:12
|
Плохо, что у меня на работе нет COM - устройств. Дома модем, вечером поэкспериментирую.
|
|||
14
Gepard
28.01.08
✎
11:37
|
||||
15
Дуб
28.01.08
✎
11:40
|
(14) Спасибо. Смотрю :)
|
|||
16
Gepard
28.01.08
✎
11:40
|
(15) там скачка примеров есть
|
|||
17
Jolly Roger
28.01.08
✎
13:05
|
m_port = new SerialPort(portName, baudRate);
m_port.ReadTimeout = 500; char[] buf = new char[10]; m_port.Read(buf, 0, 10); return new String(buf); |
|||
18
Hadgehogs
28.01.08
✎
13:07
|
(17) утечка для buf?
|
|||
19
Дуб
28.01.08
✎
13:16
|
Так работает (правда, из консольного приложения):
System.IO.Ports.SerialPort port = new System.IO.Ports.SerialPort(); port.PortName = "COM1"; port.WriteTimeout = 500; port.ReadTimeout = 500; port.BaudRate = 9600; port.Parity = Parity.None; port.DataBits = 8; port.StopBits = StopBits.One; port.Handshake = Handshake.None; port.DtrEnable = true; port.RtsEnable = true; port.NewLine = System.Environment.NewLine; port.Open(); System.Threading.Thread.Sleep(500); while (port.BytesToRead > 0) { try { Console.WriteLine(port.ReadExisting()); } catch { } } port.Close(); Похоже, "System.Threading.Thread.Sleep(500);".. Хотя, может и нет. |
|||
20
Дуб
28.01.08
✎
13:19
|
В догонку вопрос: а как таймер в консольном приложении поставить (который Windows.System.Forms.Timer? или что-нить в этом роде, чтобы без Forms обойтись)?
|
|||
21
Дуб
28.01.08
✎
13:43
|
Всё, кажися отбился кажися.. Спасибо, Товарищи! Не дали погибнуть позорно! Ухожу чинить голову...
|
|||
22
Hadgehogs
28.01.08
✎
14:00
|
Судя по этой и предыдущим веткам пишется что - то интересное. Что за зверь, если не секрет?
|
|||
23
Дуб
28.01.08
✎
14:12
|
(22) Да нифига не интересное.. Просто с АТС надо читать данные и вести базу данных по звонкам (видимо, в 1С). А база- началась, как тупой учёт кроссов (два здания (7 и 9 этажей), на каждом этаже - шкаф с кроссами; по екселевским таблицам - замучишься искать), теперь уж до кучи функционал набиваем, а, поскольку понравился C#, то на нём дописываем некоторые куски. К сожалению, C# впервые увидел пару месяцев назад, да и время приходится от 1С откусывать, так что задаю тупые вопросы. Не взыщите...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |