powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с COM портом
35 сообщений из 35, показаны все 2 страниц
Работа с COM портом
    #38652718
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть COM порт, там подцеплено оборудование. Как мне послать на него предположим #10 и считать все что он отправил
...
Рейтинг: 0 / 0
Работа с COM портом
    #38652745
Sergey TSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
des1roer,

SerialPort
...
Рейтинг: 0 / 0
Работа с COM портом
    #38652751
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: c#
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.
using System.IO.Ports;


SerialPort comport = new SerialPort();
string command = "";

//settings
comport.PortName = "COM1";
comport.BaudRate = 9600;
comport.ReadTimeout = 1000;
comport.WriteTimeout = 1000;


 //open com port
 if (!comport.IsOpen)
 {
       comport.Open();
 }

//send message to com port
if (command.Length > 0)
{
         string msg1 = comport.ReadExisting(); //Clear the input buffer
         comport.Write(command);
 }

string str = "";
ReadPortLine(ref str);


private int ReadPortLine(ref string msg)
{
    int newchar = 0;
    try
    {
         //while (!msg.EndsWith("->"))
         while (newchar != -1 || comport.BytesToRead > 0)
         {
                newchar = (int)comport.ReadByte();
                msg += (char)newchar;
         }
    }
    catch (Exception ex)
    {
            //Console.WriteLine("Read Port Line: " + ex.Message);
            return -1;
     }

    return 0;
}
...
Рейтинг: 0 / 0
Работа с COM портом
    #38652789
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот пока сделал так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        private void Form1_Load(object sender, EventArgs e)
        {
          
            SerialPort port  = new System.IO.Ports.SerialPort("COM2", 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);
            
            port.Open();
            port.Write("#10\r");
            System.Threading.Thread.Sleep(100);
 
             if (port.BytesToRead > 0)
             {              
               byte[] data = new byte[8];
               port.Read(data, 0, 8);
               for (int i = 0; i < data.Count(); i++ )
                   label1.Text += " "+ data[i].ToString();
             }
            port.Close();
        }



по сути должен вернуть 8 чисел 0.002 а возвращает 62 45 48 48 46 48 48 50
при чем если порт занят - ничего не возвращает, если иное не #10 отправляю то тоже ничего не возвращает. интересно че за глюк? может он кодит как нить возвращаемое число?
...
Рейтинг: 0 / 0
Работа с COM портом
    #38652813
Sergey TSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
des1roerКак мне послать на него предположим #10...

Что такое "#10"? Delphi-нотация символа с кодом 10? Или строка "#10"? Зачем тогда отсылаете "#10\r"?

Еще не понятна фраза:
des1roerпо сути должен вернуть 8 чисел 0.002
Восемь дробных чисел 0.002 должен вернуть?

Чему равен port.BytesToRead?
...
Рейтинг: 0 / 0
Работа с COM портом
    #38652821
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
if (port.BytesToRead > 0)
             {              

               port.Read(data, 0, port.BytesToRead ;

             }



Хотя бы так для начала.

Если устройство отзывается - это уже хорошо. Дальше читайте документацию к нему, что и когда оно должно отвечать.
...
Рейтинг: 0 / 0
Работа с COM портом
    #38652824
Sergey TSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
des1roer,

Кстати, он вернул вам, если перевести:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
62 >
45 -
48 0
48 0
46 .
48 0
48 0
50 2
...
Рейтинг: 0 / 0
Работа с COM портом
    #38652826
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть некий прибор, нужно его опрашиватьи получать с него данные. вот "#10" - это обращение к нему. это запрос , который я должен передать. в программе(левой ) я могу сам написать и получить отклик
-> #10
>-00.002-00.002-00.002-00.002-00.002-00.002-00.002-00.002 234ms
нужно также в с# отправить ему это #10. пишу "#10\r" потому что \r - конец строки и при этом он хоть что то выдает. при любом другом написании ничего не отдает
...
Рейтинг: 0 / 0
Работа с COM портом
    #38652828
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey TSV как ты это перевел? все правильно он вернул значит
...
Рейтинг: 0 / 0
Работа с COM портом
    #38652829
Sergey TSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так попробуйте:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        private void Form1_Load(object sender, EventArgs e)
        {
          
            SerialPort port  = new System.IO.Ports.SerialPort("COM2", 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);
            
            port.Open();
            port.Write("#10\r");
            System.Threading.Thread.Sleep(100);
 
             if (port.BytesToRead > 0)
             {              
               byte[] data = new byte[port.BytesToRead];
               port.Read(data, 0, port.BytesToRead);
               for (int i = 0; i < data.Count(); i++ )
                   label1.Text += " "+ data[i].ToString();
             }
            port.Close();
        }
...
Рейтинг: 0 / 0
Работа с COM портом
    #38652831
Sergey TSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
des1roer,

Смотри значения asccii
...
Рейтинг: 0 / 0
Работа с COM портом
    #38652837
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer
Код: c#
1.
System.Threading.Thread.Sleep(100);


Ацкая хрень.

Код: c#
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.
using System;
using System.IO.Ports;

class PortDataReceived
{
    public static void Main()
    {
        SerialPort mySerialPort = new SerialPort("COM1");

        mySerialPort.BaudRate = 9600;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;

        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

        mySerialPort.Open();

        Console.WriteLine("Press any key to continue...");
        Console.WriteLine();
        Console.ReadKey();
        mySerialPort.Close();
    }

    private static void DataReceivedHandler(
                        object sender,
                        SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        Console.WriteLine("Data Received:");
        Console.Write(indata);
    }
}


Здесь
...
Рейтинг: 0 / 0
Работа с COM портом
    #38652838
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как смотреть? в notepad++ перевожу
48 hex>asci H
48 asci>hex 3438
...
Рейтинг: 0 / 0
Работа с COM портом
    #38652842
Sergey TSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
des1roer,

Выше написанное EDUARD SAPOTSKI должно сработать.
А смотреть, набери в поисковике "коды ascii" и смотри численное значение и его эквивалента символа.
...
Рейтинг: 0 / 0
Работа с COM портом
    #38652886
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey TSVdes1roer,

Выше написанное EDUARD SAPOTSKI должно сработать.
А смотреть, набери в поисковике "коды ascii" и смотри численное значение и его эквивалента символа.

или привести к (char)
...
Рейтинг: 0 / 0
Работа с COM портом
    #38652887
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
private void Form1_Load(object sender, EventArgs e)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
        {

            SerialPort port = new System.IO.Ports.SerialPort("COM2", 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);
      
            port.Open();
            port.Write("#10\r");
            System.Threading.Thread.Sleep(100);

            if (port.BytesToRead > 0)
            {
                byte[] data = new byte[port.BytesToRead];
                port.Read(data, 0, port.BytesToRead);     
                ASCIIEncoding ascii = new ASCIIEncoding();
                String decoded = ascii.GetString(data);
                label2.Text = decoded;
            }        
            port.Close();        

        }


вот таким видом нормально возвращает
...
Рейтинг: 0 / 0
Работа с COM портом
    #38652893
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сейчас попробую с пример msdn разобраться. но по сути мне бы сделать таймер да раз в полминуты обращаться к оборудованию. мне кажется, что данные всяко разно вернутся
...
Рейтинг: 0 / 0
Работа с COM портом
    #38653107
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerсейчас попробую с пример msdn разобраться. но по сути мне бы сделать таймер да раз в полминуты обращаться к оборудованию. мне кажется, что данные всяко разно вернутся
-1

Используйте евент mySerialPort.DataReceived как вам посоветовали,
ваши проблемы уже давно решены, не надо велосипеды строить....
...
Рейтинг: 0 / 0
Работа с COM портом
    #38653152
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129-1


Если на ком-порте сеть RS-485 и множество устройств, то подход с событием проблематичен, т.к. нужно продолжить опрос других устройств по таймауту (если одно из них не ответило).
...
Рейтинг: 0 / 0
Работа с COM портом
    #38653159
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisD129-1


Если на ком-порте сеть RS-485 и множество устройств, то подход с событием проблематичен, т.к. нужно продолжить опрос других устройств по таймауту (если одно из них не ответило).и чо? 485-й подразумевает идентификацию комманд.
...
Рейтинг: 0 / 0
Работа с COM портом
    #38653173
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortibransaи чо? 485-й подразумевает идентификацию комманд.

При чем тут идентификация команд?
...
Рейтинг: 0 / 0
Работа с COM портом
    #38653187
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallarisfortibransaи чо? 485-й подразумевает идентификацию комманд.

При чем тут идентификация команд?А причем тогда 485-й. Я всегда с ним асинхронно работаю и что?
Если есть вероятность что устройство будет неожиданно присылать огрызки ответов, то зачем такому устройству 485-й?
...
Рейтинг: 0 / 0
Работа с COM портом
    #38653199
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortibransaЕсли есть вероятность что устройство будет неожиданно присылать огрызки ответов, то зачем такому устройству 485-й?

Сгорело одно из устройств, например.

Ну я тоже асинхронно работаю в отдельном потоке, но без событий - мне нужно сразу перейти к опросу другого устройства, если первое не ответило в течении таймаута.
...
Рейтинг: 0 / 0
Работа с COM портом
    #38653205
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisfortibransaЕсли есть вероятность что устройство будет неожиданно присылать огрызки ответов, то зачем такому устройству 485-й?

Сгорело одно из устройств, например.

Ну я тоже асинхронно работаю в отдельном потоке, но без событий - мне нужно сразу перейти к опросу другого устройства, если первое не ответило в течении таймаута.Таки-да. Команды "сыпятся" из очереди обертки класса COM порта и пока не ответит или не истечет таймаут след. команда не извлекается из очереди и тут ни чего не мешает использовать события. Да и есть еще "первоочередная" очередь, для посылки команд управления.
...
Рейтинг: 0 / 0
Работа с COM портом
    #38653207
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallarisмне нужно сразу перейти к опросу другого устройства, если первое не ответило в течении таймаута.
И чо? Дал запрос, подписался на приход, запустил таймер, нет ответа - отписался от прихода, делаем запрос другому девайсу.
...
Рейтинг: 0 / 0
Работа с COM портом
    #38653212
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EDUARD SAPOTSKIИ чо? Дал запрос, подписался на приход, запустил таймер, нет ответа - отписался от прихода, делаем запрос другому девайсу.

Не, спасибо
...
Рейтинг: 0 / 0
Работа с COM портом
    #38653291
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с событиями муть какая то. как это сделать попроще?
...
Рейтинг: 0 / 0
Работа с COM портом
    #38653341
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerс событиями муть какая то. как это сделать попроще?
Где вы нашли муть?
...
Рейтинг: 0 / 0
Работа с COM портом
    #38653438
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилdes1roerс событиями муть какая то. как это сделать попроще?
Где вы нашли муть?
При использовании события есть еще возможность задать ReceivedBytesThreshold - если размер сообщения (ответного) постоянный,
то можно будет сразу читать из буфера.
...
Рейтинг: 0 / 0
Работа с COM портом
    #38653481
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот примерно так в простейшем случае это выглядет:

Код: c#
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.
public partial class Form1 : Form
    {
        // Таймер
        Timer timer = new Timer();
        // Порт
        SerialPort port = new SerialPort("COM2", 9600, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One); 

        // Конструктор
        public Form1()
        {
            InitializeComponent();

            // Подписались на приход данных
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

            // Задаем интервал таймеру
            timer.Interval = 10000;
            // Подписываемся на тики таймера
            timer.Tick += new EventHandler(timer_Tick);
            // Стартуем таймер
            timer.Start(); 
        }

        // Таймер тикнул
        void timer_Tick(object sender, EventArgs e)
        {
            // Открываем порт
            if (port.IsOpen)
            {
                // Если порт открыт, значит какой-то косяк, девайс не ответил, здесь обрабатываем

                // Закрываем
                port.Close();
            }

            // Открываем
            port.Open();

            // Чето посылаем
            port.Write("#10\r");
        }

        // Пришли данные
        void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {

            // Получаем пришедшие данные
            string indata = port.ReadExisting();

            // Чето с ними делаем

            // Закрываем порт
            if(port.IsOpen) port.Close();
        }

    }
...
Рейтинг: 0 / 0
Работа с COM портом
    #38658248
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EDUARD SAPOTSKI , может оно и правильно вешать на событие. Но событие же не одно, приходит поток чисел, а в вашем примере дергается только несколько первых. Может таймаут больше поставить или как это решить можно
...
Рейтинг: 0 / 0
Работа с COM портом
    #38658284
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,
кто вам мешает закрывать порт позже?
собирайте данные, и закрывайте как будет полный комплект.
все "блоки" которые нужно состыковать исходя из вашей специфики тут уже привели.

еще, предвижу сложность, не факт что всегда в indata будет строка '>-00.002'/
может получаться так
1-е срабатывание DataRecieve - '>-00.002>-00.002>-00.'
2-е срабатывание - '002>-00.002>-00.002'
то есть данные могут делиться на порции, видимо исходя из размера буфера.
надо будет собирать строку, проверять разделители.. тут вам и будет понятно когда закрыть порт.

еще, метод проб и ошибок, у меня показал, что после открытия/закрытия порта сразу хорошо бы делать comPort.DiscardInBuffer();
...
Рейтинг: 0 / 0
Работа с COM портом
    #38658309
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
млин, так один фиг приходится слип ставить чтобы получить все данные а не (3 первых символа) + (оставшиеся 12)
что-то вроде этого канает

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
       int i = 0;
        // Пришли данные
        void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            System.Threading.Thread.Sleep(100);
                // Получаем пришедшие данные
               string indata = port.ReadExisting();
                
                // Чето с ними делаем
            MessageBox.Show(i++.ToString() + " " + indata);
             
                // Закрываем порт
                if (port.IsOpen) port.Close();
       
        }


но тогда по сути отличия от моего метода немного. и еще - мне компилятор ругаецца если я даже напишу this.text = indata === Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'Form1' не из того потока, в котором он был создан.
...
Рейтинг: 0 / 0
Работа с COM портом
    #38658371
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
port_DataReceived - выполняется в другом потоке, асинхронно с потоком формы, по этому и ошибка с доступом из нескольких потоков. нужно использовать Invoke

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
       int i = 0;
       string fullResult = "";
      
        // Пришли данные
        void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort port = (SerialPort)sender;
            fullResult += port.ReadExisting();
            var s = fullResult.Split('>');
            if (s.Count() >= 5 && port.IsOpen)
            {
                port.Close();
                this.Invoke(new Action(() =>
                {
                    textBox1.Text = fullResult;
                }));
                fullResult = "";
            }
        }
...
Рейтинг: 0 / 0
Работа с COM портом
    #38658373
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем порт-то закрывать, нехай открыт пока прога работает.
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с COM портом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]