Имя: Пароль:
IT
 
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С откусывать, так что задаю тупые вопросы. Не взыщите...