2016-12-04 2 views
0

Я пытаюсь создать приложение, которое может связываться с сервером, используя связь по последовательному порту.Связь последовательного порта с использованием конвертера RS-485 и сервера в C#

Сценарий:

Я есть мой ноутбук, который крепится с электрическим счетчиком (выступать в качестве сервера) через интерфейс RS-485 и USB. Теперь я хочу открыть порт и отправить исходную команду для связи с сервером и ожидать, что сервер отправит некоторый ответ.

Вот мой код

void main(string args[]) 
{ 
    SerialPort sp = new SerialPort(); 
    sp.PortName = "COM5"; 
    sp.BaudRate = 9600; 
    ... // other parameters i.e. Parity, StopBits 
    // Databits etc 
    sp.Open(); 
    sp.DataReceived = myPortDataReceived(); 
    sp.WriteLine("/?!\r\n"); 
} 
public static void myPortDataReceived(object sender, SerialPortDataReceivedEventArgs e) 
{ 
    SerialPort myPort = (SerialPort)sender; 
    String data = myPort.ReadExisting(); 
    Console.WriteLine("Data Received"); 
    Console.WriteLine(data); 
} 

При запуске программы нет никакого вывода. Это означает, что объект myPort ничего не читает.

Я новичок в программировании и понятия не имею, почему это произошло.

Любая идея действительно очень присваивается.

Благодаря

Update 1

я изменить свой код и запустить его, но он не может перейти к методу обработчика событий.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO.Ports; 
using System.Threading; 

namespace Communication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      SerialPort sp = new SerialPort(); 
      sp.PortName = "COM5"; 
      sp.Open(); 
      // check port is open or not 
      if (sp.IsOpen==true) 
       Console.WriteLine("Port is open"); 
      // set the port parameters 
      sp.BaudRate = 9600; 

      sp.DtrEnable = true; 
      sp.Handshake = Handshake.None; 
      sp.Parity = Parity.None; 
      sp.StopBits = StopBits.One; 
      sp.DataBits = 8; 
      // write some command on port 
      sp.WriteLine("?/!\r\n"); 
      // make DataReceived event handler 
      sp.DataReceived += sp_DataReceived; 
      //Console.WriteLine("Press any key to exit"); 
      //Console.ReadLine(); 
      Console.ReadKey(); 
     } 

     public static void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 
      Console.WriteLine("I am in event handler"); 
      SerialPort sPort = (SerialPort)sender; 
      String data = sPort.ReadExisting(); 
      foreach (char ch in data) 
      { 
       Console.WriteLine(ch); 
      } 
     } 
    } 
} 

И я могу поместить sPort в while(true) {String data = sPort.ReadExisting(); Console.WriteLine(data); }

+0

ответьте ,,,, – selflearner2014

ответ

0

Ваш синтаксис неверен для обработчика событий. Оно должно быть:

 sp.DataReceived += myPortDataReceived; 

Обработчик должен иметь следующую подпись:

 void myPortDataReceived(object sender, SerialDataReceivedEventArgs e) 

После того, как вы это исправить, а также проверить свои четность, количество битов, и спотовый бит все правильно. Они важны и не могут быть затушеваны.

Я бы даже не начал использовать обработчик DataReceived. Просто отправьте свою команду, а затем сидите в цикле, пока не получите какой-то ответ. Таким образом, вы можете убедиться, что вы правильно настроили последовательный порт и отправили правильные данные команды.

+0

Я могу изменить свой код, см. Обновление 1. – selflearner2014