2014-12-06 2 views
0

Я хочу читать данные моих датчиков с последовательных портов, и я могу прочитать имя портов, но я не могу получить данные от них ... Я новичок в #c и последовательного кодирования порта, благодаря, прежде чем ~не может считывать данные из последовательного порта (в C#)

и вот моя попытка:

using System; 
using System.ComponentModel; 
using System.Collections; 
using System.Diagnostics; 
using System.IO; 
using System.IO.Ports; 
using System.Text; 
using System.Security; 
using System.Security.Permissions; 
using Microsoft.Win32; 
using System.Runtime.InteropServices; 
using System.Runtime.Versioning; 
using System.Collections.Generic; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     //----------------------------------------------------- GLOBAL PARAMETER ------------------------------------------------------ 
     //---serial port objects 
     static private List <SerialPort> _serialPort = new List<SerialPort>(); 
     //---serial port read buffer 
     static private List <byte[]> _buffer = new List<byte[]>(); 
     //---length of the port list 
     static private int _length; 

     //--------------------------------------------------- INIT FUNCTIONS ---------------------------------------------------------- 
     //---init main function 
     static private void initFunction(){ 
      //create the serial port objs 
      createPortObj(); 
      //create the buffers 
      createBuffer(); 
      //init a clock 
      //init the ports' name 
      return; 
     } 

     //---Set the port objs 
     static private void setPortOption(int i) { 
      SerialPort tPort = _serialPort[i]; 

      //set options 
      tPort.BaudRate = 9600; 
      tPort.Parity = Parity.None; 
      tPort.StopBits = StopBits.One; 
      tPort.DataBits = 8; 
      tPort.Handshake = Handshake.None; 

      //set the datareceived function 
      //tPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 
      tPort.DataReceived += DataReceivedHandler; 

      tPort.Open(); 

      return; 
     } 

     //---Create the port objs 
     static private void createPortObj(){ 
      // Get a list of serial port names. 
      string[] _names = SerialPort.GetPortNames(); 
      _length = _names.Length; 

      //create the objs 
      for(int i=0; i < _length; i++) 
      { 
       Console.WriteLine(_names[i]); 
       //create the port objects 
       _serialPort.Add(new SerialPort(_names[i])); 
       //init the port object 
       setPortOption(i); 
      } 

      return; 
     } 

     //---Create the buffer 
     static private void createBuffer() { 
      //create buffer for each port obj 
      for (int i = 0; i < _length; i++){ 
       byte[] bufferOne = new Byte[_serialPort[i].BytesToRead]; 
       _buffer.Add(bufferOne); 
      } 
      return; 
     } 

     //-------------------------------------------------- FEATURED FUNCTION ---------------------------------------------------- 
     //---Transmit the code 
     //---Data received handler 
     static public void DataReceivedHandler(Object sender, SerialDataReceivedEventArgs e){ 
      SerialPort sp = (SerialPort)sender; 
      string indata = sp.ReadExisting(); 
      Console.WriteLine("Data Received:"); 
      Console.Write(indata); 


      //Receive the data from serial ports 
      for (int i=0; i<_length; i++){ 
       int temp; 
       temp = _serialPort[i].Read(_buffer[i], 100, _buffer[i].Length); 
       Console.WriteLine(temp); 

      } 

      return; 
     } 


     //-------------------------------------------------- RETRIVE FUNCTION ---------------------------------------------------- 
     //---Retrive the source 
     static private void retriveFunction(){ 
      //close the serial ports 
      foreach (SerialPort port in _serialPort){ 
       port.Close(); 
      } 

      return; 
     } 

     //-------------------------------------------------- MAIN ----------------------------------------------------------------- 
     //---main function 
     static void Main(string[] args){ 
      //init function, and open the 
      initFunction(); 

      int[] num = new int[_length]; 
      for (int i = 0; i < _length; i++){ 
       num[i] = _serialPort[i].Read(_buffer[i], 0, _buffer[i].Length); 
      } 

      //check the result of the read function 
      Console.Write(num[0]); 

      //on serial port receiving 

      //retrive the source 
      retriveFunction(); 

      Console.ReadLine(); 
     } 
    } 
} 

еще раз спасибо ~

+0

отладка. отлаживать. отлаживать. –

+0

Вы могли получать данные из последовательного порта не через приложение C#? Начните с одного последовательного порта, убедитесь, что вы можете получать данные с одного, результат чтения равен 0, и вы не поместили i var. – ilansch

+0

@ilansch я уверен, что данные могут быть получены другими приложениями, такими как arduino клиент. кроме того, я не думаю, что это проблема с массивом, вызывающая проблему – tristan

ответ

0

Я думаю, что ваш код не ждать receive.Before данных ваши датчики отправляют обратно данные, ваш код заканчивается, программа заканчивается, вы должны обрабатывать данные в сети w или в событии DataReceived.

+0

о, вы имеете в виду функцию «SerialDataReceivedEventHandler»? я уже добавил его в код выше, и что странно, что функция прослушивателя событий не вызывается (я установил разрыв и просто вижу, что программа игнорирует код) – tristan