Работа с COM портом

des1roer
Дата: 27.05.2014 08:47:29
Есть COM порт, там подцеплено оборудование. Как мне послать на него предположим #10 и считать все что он отправил
Sergey TSV
Дата: 27.05.2014 09:31:25
des1roer,

SerialPort
jenya7
Дата: 27.05.2014 09:33:13
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;
}
des1roer
Дата: 27.05.2014 10:00:07
вот пока сделал так

        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 отправляю то тоже ничего не возвращает. интересно че за глюк? может он кодит как нить возвращаемое число?
Sergey TSV
Дата: 27.05.2014 10:19:36
des1roer
Как мне послать на него предположим #10...


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

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

Восемь дробных чисел 0.002 должен вернуть?

Чему равен port.BytesToRead?
Pallaris
Дата: 27.05.2014 10:23:45
if (port.BytesToRead > 0)
             {              

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

             }


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

Если устройство отзывается - это уже хорошо. Дальше читайте документацию к нему, что и когда оно должно отвечать.
Sergey TSV
Дата: 27.05.2014 10:25:29
des1roer,

Кстати, он вернул вам, если перевести:
62 >
45 -
48 0
48 0
46 .
48 0
48 0
50 2
des1roer
Дата: 27.05.2014 10:26:16
есть некий прибор, нужно его опрашиватьи получать с него данные. вот "#10" - это обращение к нему. это запрос , который я должен передать. в программе(левой ) я могу сам написать и получить отклик
-> #10
>-00.002-00.002-00.002-00.002-00.002-00.002-00.002-00.002 234ms
нужно также в с# отправить ему это #10. пишу "#10\r" потому что \r - конец строки и при этом он хоть что то выдает. при любом другом написании ничего не отдает
des1roer
Дата: 27.05.2014 10:26:56
Sergey TSV как ты это перевел? все правильно он вернул значит
Sergey TSV
Дата: 27.05.2014 10:28: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();
        }