C# problem with two threads and hardware access
        Posted  
        
            by mack369
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by mack369
        
        
        
        Published on 2010-03-13T16:47:36Z
        Indexed on 
            2010/03/13
            16:55 UTC
        
        
        Read the original article
        Hit count: 376
        
I'm creating an application which communicates with the device via FT2232H USB/RS232 converter. For communication I'm using FTD2XX_NET.dll library from FTDI website.
I'm using two threads:
I've got a problem when I'm trying to write any data to the device while the receiver's thread is running. The main thread simply hangs up on ftdiDevice.Write function.
I tried to synchronize both threads so that only one thread can use Read/Write function at the same time, but it didn't help.
Below code responsible for the communication. Note that following functions are methods of FtdiPort class.
Receiver's thread
        private void receiverLoop()
        {
            if (this.DataReceivedHandler == null)
            {
                throw new BackendException("dataReceived delegate is not set");
            }
            FTDI.FT_STATUS ftStatus = FTDI.FT_STATUS.FT_OK;
            byte[] readBytes = new byte[this.ReadBufferSize];
            while (true)
            {
                lock (FtdiPort.threadLocker)
                {
                    UInt32 numBytesRead = 0;
                    ftStatus = ftdiDevice.Read(readBytes, this.ReadBufferSize, ref numBytesRead);
                    if (ftStatus == FTDI.FT_STATUS.FT_OK)
                    {
                        this.DataReceivedHandler(readBytes, numBytesRead);
                    }
                    else
                    {
                        Trace.WriteLine(String.Format("Couldn't read data from ftdi: status {0}", ftStatus));
                        Thread.Sleep(10);
                    }                    
                }
                Thread.Sleep(this.RXThreadDelay);
            }
        }
Write function called from main thread
    public void Write(byte[] data, int length)
    {
        if (this.IsOpened)
        {
            uint i = 0;
            lock (FtdiPort.threadLocker)
            {
                this.ftdiDevice.Write(data, length, ref i);
            }
            Thread.Sleep(1);
            if (i != (int)length)
            {
                throw new BackendException("Couldnt send all data");
            }
        }
        else
        {
            throw new BackendException("Port is closed");
        }
    }
Object used to synchronize two threads
static Object threadLocker = new Object();
Method that starts the receiver's thread
        private void startReceiver()
        {
            if (this.DataReceivedHandler == null)
            {
                return;
            }
            if (this.IsOpened == false)
            {
                throw new BackendException("Trying to start listening for raw data while disconnected");
            }
            this.receiverThread = new Thread(this.receiverLoop);
            //this.receiverThread.Name = "protocolListener";
            this.receiverThread.IsBackground = true;
            this.receiverThread.Start();
        }
ftStatus = ftdiDevice.Read(readBytes, this.ReadBufferSize, ref numBytesRead);© Stack Overflow or respective owner