2014-12-06 90 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

调试。调试。调试。 – 2014-12-06 06:20:02

+0

您是否能够通过串口获取数据,而不是通过C#应用程序?从一个串口开始,确保你能够从一个接收数据,读取的结果是0,你没有把我的变种.. – ilansch 2014-12-06 07:13:55

+0

@ilansch我敢肯定,数据可以被其他应用程序接收,如arduino客户。此外,我不认为这是阵列的事情导致问题 – tristan 2014-12-06 08:44:22

回答

0

我觉得你的代码是不是等待数据receive.Before你的传感器发回数据,你的代码完成,程序结束,你应该处理数据w线程或DataReceived事件中。

+0

哦,你的意思是“SerialDataReceivedEventHandler”函数?我已经将它添加到上面的代码中,奇怪的是,事件侦听器函数没有被调用(我已经设置了中断,只是看到程序忽略了代码) – tristan 2014-12-06 08:55:02