0

I wanna read from my sensors' data from serial ports, and i can read the name of the ports but i can't receive data from them... i'm new in #c and serial port coding, thanks before~

And here's my try:

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();
        }
    }
}

thanks again~

tristan
  • 1
  • 2
  • debug. debug. debug. – Mitch Wheat Dec 06 '14 at 06:20
  • Were you able to get data from the serial port not via your C# application ? Start with a single serial port, make sure you are able to receive data from one, result of read is 0 and you didnt put the i var.. – ilansch Dec 06 '14 at 07:13
  • @ilansch i'm sure the data can be receive by other applications, like arduino client. besides, i don't think it's the array thing that cause the problem – tristan Dec 06 '14 at 08:44

1 Answers1

0

I think your code is not wait for data receive.Before your sensors sends back data,your code is finish,program is end,you should handle data in a new thread or in DataReceived event.

neo zheng
  • 1
  • 1
  • oh, do you mean the "SerialDataReceivedEventHandler" function? i have already added it to the code above and what's odd is that, the event listener function is not invoked (i have set the break and just see the program ignore the code) – tristan Dec 06 '14 at 08:55