
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.197.111.121] |
![]() |
|
Сообщ.
#1
,
|
|
|
В практике часто требуется найти решение на тот или иной вопрос, но не всегда ответ очевиден. Вот так же случилось у меня. В работе столкнулся с тем что надо принять данные с СОМ порта, ну что же подумал я, плевое дело. Бросил на форму компонент SerialPort и ListBox, в событии serialPort1_DataReceived задал для listBox1 новый итем с данными из СОМ порта, код выглядел так:
![]() ![]() private void Form1_Load(object sender, EventArgs e) { serialPort1.Open(); //открываем порт } private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { listBox1.Items.Add(serialPort1.ReadLine()); //получаем данные } Все просто до безобразия, но запустив проект я не увидел никаких данных. Написал подобный проект на Borland C++ Builder6, там все работало. После долгих поисков нашол кусок кода для работы с СОМ портом, помоему на www.codeproject.com, который натолкнул на мысль и появилась реализация через Callback посылку данных с порта на ListBox. Код этого метода ниже ![]() ![]() using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO.Ports; namespace SerrialPortReader { public partial class Form1 : Form { string InputData = String.Empty; delegate void SetTextCallback(string text); //объявляем делегата для Callback метода public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // получаем список СОМ портов системы string[] ports = SerialPort.GetPortNames(); foreach (string port in ports) { comboBox1.Items.Add(port); } } void AddData(string text) { listBox1.Items.Add(text); //отображаем полученные данные } private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { InputData = port.ReadExisting(); if (InputData != String.Empty) { SetText(InputData); } } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { if (comboBox1.Text != "") { groupBox2.Enabled = true; button1.Enabled = true; } else { groupBox2.Enabled = false; button1.Enabled = false; } } private void button1_Click(object sender, EventArgs e) { if (button1.Text == "Старт") { if (port.IsOpen) port.Close(); #region Задаем параметры порта port.PortName = comboBox1.Text; port.BaudRate = Convert.ToInt32(comboBox2.Text); port.DataBits = Convert.ToInt32(comboBox3.Text); switch (comboBox4.Text) { case "Пробел": port.Parity = Parity.Space; break; case "Чет": port.Parity = Parity.Even; break; case "Нечет": port.Parity = Parity.Odd; break; case "Маркер": port.Parity = Parity.Mark; break; default: port.Parity = Parity.None; break; } switch (comboBox5.Text) { case "2": port.StopBits = StopBits.Two; break; case "1.5": port.StopBits = StopBits.OnePointFive; break; case "Нет": port.StopBits = StopBits.None; break; default: port.StopBits = StopBits.One; break; } switch (comboBox6.Text) { case "Xon/Xoff": port.Handshake = Handshake.XOnXOff; break; case "Аппаратное": port.Handshake = Handshake.RequestToSend; break; default: port.Handshake = Handshake.None; break; } #endregion try { port.Open(); button1.Text = "Стоп"; button2.Enabled = false; } catch { MessageBox.Show("Порт " + port.PortName + " невозможно открыть!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Warning); comboBox1.SelectedText = ""; button1.Text = "Старт"; } } else { if (port.IsOpen) port.Close(); button1.Text = "Старт"; button2.Enabled = true; } } //соответственно сам метод нашего Callback'а private void SetText(string text ) { if (this.listBox1.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { text }); } else { this.AddData(text); } } //корректно завершаем работу программы private void Form1_FormClosing(object sender, FormClosingEventArgs e) { button1.Text = "Стоп"; Application.DoEvents(); button1_Click(sender, e); Application.DoEvents(); } В аттаче проект программы позволяющий просматривать данные с СОМ порта Прикреплённый файл ![]() |
Сообщ.
#2
,
|
|
|
Вот я тоже столкнулся в работе с необходимостью получать данные с ком-порта, нашел Ваш пост, скачал прогу и она "естественно" не работает. вот тчо выдает output:
'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities\8.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_MSIL\System.Drawing\2.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities.Sync\8.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.Sync.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\Documents and Settings\Administrator\Desktop\Migel\SerrialPortReader\SerrialPortReader2\bin\Debug\SerrialPortReader.vshost.exe', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_64\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_MSIL\System.Deployment\2.0.0.0__b03f5f7f11d50a3a\System.Deployment.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_MSIL\System.Xml\2.0.0.0__b77a5c561934e089\System.Xml.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. The thread 0x8cc has exited with code 0 (0x0). 'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\Documents and Settings\Administrator\Desktop\Migel\SerrialPortReader\SerrialPortReader2\bin\Debug\SerrialPortReader.exe', Symbols loaded. The thread 0x914 has exited with code 0 (0x0). The thread 0xb38 has exited with code 0 (0x0). The thread 0xc40 has exited with code 0 (0x0). The program '[3896] SerrialPortReader.vshost.exe: Managed' has exited with code 0 (0x0). подскажите, пожалуйста, что делать! |
Сообщ.
#3
,
|
|
|
если можно немного подробней что вы пытаетесь сделать, и где именно программа падает.
|
Сообщ.
#4
,
|
|
|
Для работы с serial port есть более продвинутые средства библиотека boost написаная на с++ кросплатформенна в этом есть много преимуществ. Там есть средства для работы с com port очень хорошая статью по этой совместной работе boost и serial port чтении и передачи данных можно найти здесь http://robot-develop.org/archives/450
|
Сообщ.
#5
,
|
|
|
Цитата lord.tiran @ Для работы с serial port есть более продвинутые средства библиотека boost написаная на с++ кросплатформенна в этом есть много преимуществ. Там есть средства для работы с com port очень хорошая статью по этой совместной работе boost и serial port чтении и передачи данных можно найти здесь http://robot-develop.org/archives/450 Осталось только как то притянуть сюда .NET )))) |
Сообщ.
#6
,
|
|
|
Почему "запустив проект вы не увидели никаких данных"? Я запускаю программу на с# для передачи данных по сом-порту и тоже ничего не вижу. Пишет "Доступ к порту 'СОМ1' закрыт"". А аналогичная программа , но написанная на С ++ работать будет?
|
Сообщ.
#7
,
|
|
|
стал делать код как у Вас.
Столкнулся с такой проблемой: 1. добавил код по отправке данных ![]() ![]() private void send_Click(object sender, EventArgs e) { //отправляем сообщение portRS232.WriteLine("5"); listBoxRX.Items.Add(dataRX); } 2. На com порту замыкаю TX на RX 3. Принимаю данные: ![]() ![]() private void portRS232_DataReceived(object sender, SerialDataReceivedEventArgs e) { dataRX = portRS232.ReadExisting(); listBoxRX.Items.Add(dataRX); } И тут возникает такое исключение: В вашем исходном коде так же. Причем если запускать программу не из VS, то все вобщем то работает. Число 5 приходит нормально отображается в listBox. Среда VS2010 Express. Прикреплённая картинка
|
Сообщ.
#8
,
|
|
|
внимательно рассмотрел и понял что сделал не как у Вас.
Переделал прием сообщений как у вас и все заработало. А можно подробные комментарии к этому коду? ![]() ![]() private void SetText(string text) { if (this.listBox1.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { text }); } else { this.AddData(text); } } |