public Read ( byte dataBuffer, |
||
dataBuffer | byte | An array of bytes which will be populated with the data read from the device. |
numBytesToRead | The number of bytes requested from the device. | |
numBytesRead | The number of bytes actually read. | |
return | FT_STATUS |
private void AttemptConnect() { connected = false; UInt32 DeviceCount = 0; FTDI.FT_STATUS ftStatus = FTDI.FT_STATUS.FT_OK; // Create new instance of the FTDI device class ftdi = new FTDI(); // Determine the number of FTDI devices connected to the machine ftStatus = ftdi.GetNumberOfDevices( ref DeviceCount ); // Check status if(ftStatus != FTDI.FT_STATUS.FT_OK || DeviceCount == 0) { commStat = CommStatus.NoDevice; return; } commStat = CommStatus.NoElev8; // Allocate storage for device info list FTDI.FT_DEVICE_INFO_NODE[] DeviceList = new FTDI.FT_DEVICE_INFO_NODE[DeviceCount]; try { // Populate our device list ftStatus = ftdi.GetDeviceList( DeviceList ); bool FoundElev8 = false; for(int i = 0; i < DeviceCount && FoundElev8 == false; i++) { if(DeviceList[i].Type != FTDI.FT_DEVICE.FT_DEVICE_X_SERIES) continue; for(int baud = 0; baud < 2; baud++) { ftStatus = ftdi.OpenBySerialNumber( DeviceList[i].SerialNumber ); if(ftStatus == FTDI.FT_STATUS.FT_OK) { string portName; ftdi.GetCOMPort( out portName ); if(portName == null || portName == "") { ftdi.Close(); continue; } if(baud == 0) { ftdi.SetBaudRate( 115200 ); // try this first } else { ftdi.SetBaudRate( 57600 ); // then try this (xbee) } ftdi.SetDataCharacteristics( 8, 1, 0 ); ftdi.SetFlowControl( FTDI.FT_FLOW_CONTROL.FT_FLOW_NONE, 0, 0 ); txBuffer[0] = (byte)'E'; txBuffer[1] = (byte)'l'; txBuffer[2] = (byte)'v'; txBuffer[3] = (byte)'8'; uint written = 0; for(int j = 0; j < 10 && FoundElev8 == false && !quit; j++) // Keep pinging until it replies, or we give up { ftdi.Write( txBuffer, 4, ref written ); System.Threading.Thread.Sleep( 50 ); uint bytesAvail = 0; ftdi.GetRxBytesAvailable( ref bytesAvail ); // How much data is available from the serial port? if(bytesAvail > 0) { int TestVal = 0; while(bytesAvail > 0 && !quit) { uint bytesRead = 0; ftdi.Read( rxBuffer, 1, ref bytesRead ); if(bytesRead == 1) { TestVal = (TestVal << 8) | rxBuffer[0]; if(TestVal == (int)(('E' << 0) | ('l' << 8) | ('v' << 16) | ('8' << 24)) ) { FoundElev8 = true; commStat = CommStatus.Connected; break; } } if(bytesRead == 0) break; } } } if(FoundElev8) { connected = true; if(ConnectionStarted != null) { ConnectionStarted(); } break; } else { ftdi.Close(); } } } } } catch(Exception) { return; } }
static void Main(string[] args) { string deviceSerialNumber = "33VRWQARA"; FTDI.FT_STATUS status = new FTDI.FT_STATUS(); FTDI device = new FTDI(); UInt32 numberOfDevices = 0; int sleepTime = 100; status = device.GetNumberOfDevices(ref numberOfDevices); FTDI.FT_DEVICE_INFO_NODE[] devicelist = new FTDI.FT_DEVICE_INFO_NODE[numberOfDevices]; status = device.GetDeviceList(devicelist); Thread.Sleep(sleepTime); if (status == FTDI.FT_STATUS.FT_OK) Console.WriteLine("We have {0} devices", numberOfDevices); else Console.WriteLine("Failed to get number of devices"); status = device.OpenBySerialNumber(deviceSerialNumber); Thread.Sleep(sleepTime); if(status == FTDI.FT_STATUS.FT_OK) Console.WriteLine("Device {0} is opened", deviceSerialNumber); else Console.WriteLine("Failed to open {0} device", deviceSerialNumber); status = device.SetBitMode(0xff, FTDI.FT_BIT_MODES.FT_BIT_MODE_RESET); Thread.Sleep(sleepTime); if (status == FTDI.FT_STATUS.FT_OK) Console.WriteLine("BitMode is resetted"); else Console.WriteLine("Failed to reset BitMode"); status = device.SetBitMode(0xff, FTDI.FT_BIT_MODES.FT_BIT_MODE_SYNC_FIFO); Thread.Sleep(sleepTime); if (status == FTDI.FT_STATUS.FT_OK) Console.WriteLine("BitMode is {0}", FTDI.FT_BIT_MODES.FT_BIT_MODE_SYNC_FIFO); else Console.WriteLine("Failed to set BitMode"); byte latency = 2; device.SetLatency(latency); Thread.Sleep(sleepTime); if (status == FTDI.FT_STATUS.FT_OK) Console.WriteLine("Latency timer value is {0}", latency); else Console.WriteLine("Failed to set latency"); uint inTransferSize = 0x10000; device.InTransferSize(inTransferSize); Thread.Sleep(sleepTime); if (status == FTDI.FT_STATUS.FT_OK) Console.WriteLine("inTransferSize value is {0}", inTransferSize); else Console.WriteLine("Failed to set inTransferSize"); device.SetFlowControl(FTDI.FT_FLOW_CONTROL.FT_FLOW_RTS_CTS, 0x00, 0x00); Thread.Sleep(sleepTime); if (status == FTDI.FT_STATUS.FT_OK) Console.WriteLine("FlowControl is {0}", FTDI.FT_FLOW_CONTROL.FT_FLOW_RTS_CTS); else Console.WriteLine("Failed to set FlowControl"); device.Purge(FTDI.FT_PURGE.FT_PURGE_RX); uint numBytes = 0; //int cycles = 0; using(FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)) { using (BinaryWriter bw = new BinaryWriter(fs)) { while (Console.KeyAvailable == false) { device.GetRxBytesAvailable(ref numBytes); if (numBytes >= 1) { //cycles++; byte[] bBuf = new byte[numBytes]; device.Read(bBuf, numBytes, ref numBytes); bw.Write(bBuf); //if (cycles == 1) //{ // cycles = 0; // Console.WriteLine("{0}", bBuf.Length); //} } if (numBytes >= 0x10000) { Console.WriteLine("Buffer overload!"); } } //Console.WriteLine("Press 'p' to erase control bytes, 'q' to quite"); //ConsoleKeyInfo cki = Console.ReadKey(false); //if (cki.Key == ConsoleKey.Q) // Environment.Exit(-1); //if (cki.Key == ConsoleKey.P) //{ //} } } Console.WriteLine("Key is pressed, end of file writting"); }
private void AttemptConnect() { connected = false; UInt32 DeviceCount = 0; FTDI.FT_STATUS ftStatus = FTDI.FT_STATUS.FT_OK; // Create new instance of the FTDI device class ftdi = new FTDI(); // Determine the number of FTDI devices connected to the machine ftStatus = ftdi.GetNumberOfDevices( ref DeviceCount ); // Check status if(ftStatus != FTDI.FT_STATUS.FT_OK || DeviceCount == 0) { commStat = CommStatus.NoDevice; return; } commStat = CommStatus.NoElev8; // Allocate storage for device info list FTDI.FT_DEVICE_INFO_NODE[] DeviceList = new FTDI.FT_DEVICE_INFO_NODE[DeviceCount]; try { // Populate our device list ftStatus = ftdi.GetDeviceList( DeviceList ); bool FoundElev8 = false; for(int i = 0; i < DeviceCount && FoundElev8 == false; i++) { if(DeviceList[i].Type != FTDI.FT_DEVICE.FT_DEVICE_X_SERIES) continue; ftStatus = ftdi.OpenBySerialNumber( DeviceList[i].SerialNumber ); if(ftStatus == FTDI.FT_STATUS.FT_OK) { string portName; ftdi.GetCOMPort( out portName ); if(portName == null || portName == "") { ftdi.Close(); continue; } ftdi.SetBaudRate( 115200 ); ftdi.SetDataCharacteristics( 8, 1, 0 ); ftdi.SetFlowControl( FTDI.FT_FLOW_CONTROL.FT_FLOW_NONE, 0, 0 ); txBuffer[0] = (byte)0; // Set it to MODE_None to stop it writing (reset in case it was disconnected) txBuffer[1] = (byte)0xff; // Send 0xff to the Prop to see if it replies uint written = 0; for(int j = 0; j < 10 && FoundElev8 == false; j++) // Keep pinging until it replies, or we give up { ftdi.Write( txBuffer, 2, ref written ); System.Threading.Thread.Sleep( 50 ); uint bytesAvail = 0; ftdi.GetRxBytesAvailable( ref bytesAvail ); // How much data is available from the serial port? if(bytesAvail > 0) { uint bytesRead = 0; ftdi.Read( rxBuffer, 1, ref bytesRead ); // If it comes back with 0xE8 it's the one we want if(bytesRead == 1 && rxBuffer[0] == 0xE8) { FoundElev8 = true; commStat = CommStatus.Connected; break; } } } if(FoundElev8) { connected = true; txBuffer[0] = 2; // MODE_Sensors written = 0; ftdi.Write( txBuffer, 1, ref written ); if(ConnectionStarted != null) { ConnectionStarted(); } break; } else { ftdi.Close(); } } } } catch(Exception) { return; } }
static void open(FTDI myFtdiDevice) { UInt32 ftdiDeviceCount = 0; FTDI.FT_STATUS ftStatus = FTDI.FT_STATUS.FT_OK; // Determine the number of FTDI devices connected to the machine ftStatus = myFtdiDevice.GetNumberOfDevices(ref ftdiDeviceCount); // Check status if (ftStatus != FTDI.FT_STATUS.FT_OK) { return; } // If no devices available, return if (ftdiDeviceCount == 0) return; Console.WriteLine("Number of FTDI devices: " + ftdiDeviceCount.ToString()); // Allocate storage for device info list FTDI.FT_DEVICE_INFO_NODE[] ftdiDeviceList = new FTDI.FT_DEVICE_INFO_NODE[ftdiDeviceCount]; // Populate our device list ftStatus = myFtdiDevice.GetDeviceList(ftdiDeviceList); int oIdx=-1; if (ftStatus == FTDI.FT_STATUS.FT_OK) { for (Int32 i = 0; i < ftdiDeviceCount; i++) { if (ftdiDeviceList[i].Type == FTDI.FT_DEVICE.FT_DEVICE_232R) { oIdx = i; } } if (oIdx < 0) { Console.WriteLine("no matching device"); return; } } Console.WriteLine("Device Index: " + oIdx.ToString()); Console.WriteLine("Flags: " + String.Format("{0:x}", ftdiDeviceList[oIdx].Flags)); Console.WriteLine("Type: " + ftdiDeviceList[oIdx].Type.ToString()); Console.WriteLine("ID: " + String.Format("{0:x}", ftdiDeviceList[oIdx].ID)); Console.WriteLine("Location ID: " + String.Format("{0:x}", ftdiDeviceList[oIdx].LocId)); Console.WriteLine("Serial Number: " + ftdiDeviceList[oIdx].SerialNumber.ToString()); Console.WriteLine("Description: " + ftdiDeviceList[oIdx].Description.ToString()); myFtdiDevice.SetDTR(false); myFtdiDevice.SetRTS(false); // Open first device in our list by serial number ftStatus = myFtdiDevice.OpenBySerialNumber(ftdiDeviceList[oIdx].SerialNumber); if (ftStatus != FTDI.FT_STATUS.FT_OK) { // Wait for a key press Console.WriteLine("Failed to open device (error " + ftStatus.ToString() + ")"); //Console.ReadKey(); return; } myFtdiDevice.SetDTR(false); myFtdiDevice.SetRTS(false); // Set up device data parameters uint baud = 230400; if (ConfigurationManager.AppSettings["BaudRate"] != null) { baud = UInt32.Parse(ConfigurationManager.AppSettings["BaudRate"]); } ftStatus = myFtdiDevice.SetBaudRate(baud); if (ftStatus != FTDI.FT_STATUS.FT_OK) { // Wait for a key press Console.WriteLine("Failed to set Baud rate (error " + ftStatus.ToString() + ")"); //Console.ReadKey(); return; } // Set data characteristics - Data bits, Stop bits, Parity ftStatus = myFtdiDevice.SetDataCharacteristics(FTDI.FT_DATA_BITS.FT_BITS_8, FTDI.FT_STOP_BITS.FT_STOP_BITS_1, FTDI.FT_PARITY.FT_PARITY_NONE); if (ftStatus != FTDI.FT_STATUS.FT_OK) { // Wait for a key press Console.WriteLine("Failed to set data characteristics (error " + ftStatus.ToString() + ")"); //Console.ReadKey(); return; } // Set flow control - set RTS/CTS flow control ftStatus = myFtdiDevice.SetFlowControl(FTDI.FT_FLOW_CONTROL.FT_FLOW_NONE, 0x11, 0x13); if (ftStatus != FTDI.FT_STATUS.FT_OK) { // Wait for a key press Console.WriteLine("Failed to set flow control (error " + ftStatus.ToString() + ")"); //Console.ReadKey(); return; } // times out at 100ms ftStatus = myFtdiDevice.SetTimeouts(100, 100); if (ftStatus != FTDI.FT_STATUS.FT_OK) { // Wait for a key press Console.WriteLine("Failed to set timeouts (error " + ftStatus.ToString() + ")"); //Console.ReadKey(); return; } attention(); Console.WriteLine("CONNECTED. PRESS ANY KEY TO START."); Console.WriteLine("CTRL-R: RESET"); Console.WriteLine("CTRL-P: PROGRAM"); Console.WriteLine("CTRL-T: SET TIME"); prompt(); myFtdiDevice.SetDTR(true); Thread.Sleep(100); myFtdiDevice.SetDTR(false); while (true) { UInt32 numBytes = 0; byte[] buf = new byte[1024]; while (Console.KeyAvailable) { ConsoleKeyInfo cki = Console.ReadKey(true); //Console.WriteLine("{0} (character '{1}')", cki.Key, cki.KeyChar); if ((cki.Modifiers & ConsoleModifiers.Control) != 0) { if (cki.Key.ToString().ToUpper().EndsWith("R")) { attention(); Console.WriteLine("\nRESET!"); prompt(); myFtdiDevice.SetRTS(false); myFtdiDevice.SetDTR(true); Thread.Sleep(100); myFtdiDevice.SetDTR(false); continue; } if (cki.Key.ToString().ToUpper().EndsWith("P")) { attention(); Console.WriteLine("\nPROGRAM MODE:"); myFtdiDevice.Close(); program(); string firmwareName = ConfigurationManager.AppSettings["FirmwareName"]; LpcProgrammer p = new LpcProgrammer(new StringOutDelegate(myStrDelegate)); //p.Prepare(); int r = p.Program(firmwareName); attention(); Console.WriteLine("\nRETURN VALUE: {0}", r); subdue(); throw new Exception("Leaving program mode"); } if (cki.Key.ToString().ToUpper().EndsWith("T")) { // Time: 10:11:0 // Date: 2827.5.9 string datePatt = @"yyyy.M.d"; string timePatt = @"HH:mm:ss"; DateTime dispDt = DateTime.Now; string dtString = "set_date " + dispDt.ToString(datePatt) + "\r"; string tmString = "set_time " + dispDt.ToString(timePatt) + "\r"; //Console.WriteLine(dtString); //Console.WriteLine(tmString); System.Text.ASCIIEncoding ASCII = new System.Text.ASCIIEncoding(); Byte[] cmdBytes = ASCII.GetBytes(dtString); myFtdiDevice.Write(cmdBytes, cmdBytes.Length, ref numBytes); Thread.Sleep(200); cmdBytes = ASCII.GetBytes(tmString); myFtdiDevice.Write(cmdBytes, cmdBytes.Length, ref numBytes); continue; } } buf[0] = (byte)(cki.KeyChar & 0xff); numBytes = 0; ftStatus = myFtdiDevice.Write(buf, 1, ref numBytes); if (ftStatus != FTDI.FT_STATUS.FT_OK) { throw new Exception("Failed to write to device (error " + ftStatus.ToString() + ")"); //return; } } numBytes = 0; ftStatus = myFtdiDevice.GetRxBytesAvailable(ref numBytes); if (ftStatus != FTDI.FT_STATUS.FT_OK) { throw new Exception("Failed to get number of bytes available to read (error " + ftStatus.ToString() + ")"); //return; } if (numBytes > 0) { UInt32 numBytesRead = 0; byte[] buffer = new byte[1024]; // Note that the Read method is overloaded, so can read string or byte array data //ftStatus = myFtdiDevice.Read(out readData, 1024, ref numBytesRead); ftStatus = myFtdiDevice.Read(buffer, 1024, ref numBytesRead); if (ftStatus != FTDI.FT_STATUS.FT_OK) { // Wait for a key press throw new Exception("Failed to read data (error " + ftStatus.ToString() + ")"); //Console.ReadKey(); //return; } string readData = System.Text.Encoding.ASCII.GetString(buffer, 0, (int)numBytesRead); Console.Write(readData); } else { Thread.Sleep(10); } } }
// public methods /// <summary> /// Attempt to open RHA2000-EVAL board connected to USB port. /// </summary> /// <param name="firmwareID1">Board ID number (1 of 3)</param> /// <param name="firmwareID2">Board ID number (2 of 3)</param> /// <param name="firmwareID3">Board ID number (3 of 3)</param> public void Open(ref int firmwareID1, ref int firmwareID2, ref int firmwareID3) { // Open FTDI USB device. UInt32 ftdiDeviceCount = 0; FTDI.FT_STATUS ftStatus = FTDI.FT_STATUS.FT_OK; // Create new instance of the FTDI device class. myFtdiDeviceA = new FTDI(); // Determine the number of FTDI devices connected to the machine. ftStatus = myFtdiDeviceA.GetNumberOfDevices(ref ftdiDeviceCount); // Check status. if (!(ftStatus == FTDI.FT_STATUS.FT_OK)) { UsbException e = new UsbException("USB Setup Error: Failed to get number devices"); throw e; } // If no devices available, return. if (ftdiDeviceCount == 0) { UsbException e = new UsbException("No valid USB devices detected"); throw e; } // Allocate storage for device info list. FTDI.FT_DEVICE_INFO_NODE[] ftdiDeviceList = new FTDI.FT_DEVICE_INFO_NODE[ftdiDeviceCount]; // Populate our device list. ftStatus = myFtdiDeviceA.GetDeviceList(ftdiDeviceList); // There could be a status error here, but we're not checking for it... // The Intan Technologies RHA2000-EVAL board uses an FTDI FT2232H chip to provide a USB // interface to a PC. Detailed information on this chip may be found at: // // http://www.ftdichip.com/Products/ICs/FT2232H.htm // // The FT2232H supports two independent FIFO channels. The channel used by the RHA2000-EVAL // board is factory-configured with the name "Intan I/O board 1.0 A". (FTDI provides software // routines to open device by its name.) ftStatus = myFtdiDeviceA.OpenByDescription("Intan I/O Board 1.0 A"); if (ftStatus != FTDI.FT_STATUS.FT_OK) { UsbException e = new UsbException("Intan USB device A not found"); throw e; } // Set read timeout to 5 seconds, write timeout to infinite ftStatus = myFtdiDeviceA.SetTimeouts(5000, 0); // There could be status error here, but we're not checking for it... this.Stop(); // Purge receive buffer myFtdiDeviceA.Purge(FTDI.FT_PURGE.FT_PURGE_RX); // Check board ID and version number // // The RHA2000-EVAL board is controlled by sending one-byte ASCII command characters over // the USB interface. The 'I' character commands the board to return a 3-byte ID/version // number. UInt32 numBytesWritten = 0; Byte[] myChars = { 73 }; // 'I' = request board ID and version number ftStatus = myFtdiDeviceA.Write(myChars, 1, ref numBytesWritten); if (ftStatus != FTDI.FT_STATUS.FT_OK) { UsbException e = new UsbException("Could not write to Intan USB device"); throw e; } const UInt32 numBytesToRead = 3; // Wait until the desired number of bytes have been received. UInt32 numBytesAvailable = 0; while (numBytesAvailable < numBytesToRead) { ftStatus = myFtdiDeviceA.GetRxBytesAvailable(ref numBytesAvailable); if (ftStatus != FTDI.FT_STATUS.FT_OK) { UsbException e = new UsbException("Failed to get number of USB bytes available to read"); throw e; } } // Now that we have the amount of data we want available, read it. UInt32 numBytesRead = 0; ftStatus = myFtdiDeviceA.Read(readDataBufferA, numBytesToRead, ref numBytesRead); if (ftStatus != FTDI.FT_STATUS.FT_OK) { UsbException e = new UsbException("USB read error"); throw e; } firmwareID1 = Convert.ToInt32(readDataBufferA[0]); firmwareID2 = Convert.ToInt32(readDataBufferA[1]); firmwareID3 = Convert.ToInt32(readDataBufferA[2]); Debug.WriteLine("Board ID: " + readDataBufferA[0] + " " + (Convert.ToInt32(readDataBufferA[1])).ToString() + " " + (Convert.ToInt32(readDataBufferA[2])).ToString()); this.ZCheckOff(); this.SettleOff(); // Purge receive buffer. myFtdiDeviceA.Purge(FTDI.FT_PURGE.FT_PURGE_RX); dataJustStarted = true; }
private void Read() { byte[] packetStart = new byte[2]; byte[] packetBody = new byte[10]; uint read = 0; centralBoardCom.Read(packetStart, 2, ref read); if (packetStart[0] == 0xff && packetStart[1] == 0xff) //Start of packet detected { centralBoardCom.Read(packetBody, 10, ref read); int sum = 0; for (int i = 0; i < 9; i++) { sum += packetBody[i]; } if ((byte)(sum & 0xff) != packetBody[9]) { return; } byte IRInfo = packetBody[8]; Monitor.Enter(BottomSensorValue); BottomSensorValue[0] = ((IRInfo & 1) == 1 ? true : false); BottomSensorValue[1] = (((IRInfo >> 1) & 1) == 1 ? true : false); Monitor.Exit(BottomSensorValue); int IRChannel0Num = (IRInfo >> 2) & 7; int IRChannel1Num = (IRInfo >> 5) & 7; Monitor.Enter(IRSensorValue); IRSensorValue[IRChannel0Num] = (ushort)((packetBody[1] << 8) | packetBody[0]); IRSensorValue[IRChannel1Num] = (ushort)((packetBody[3] << 8) | packetBody[2]); Monitor.Exit(IRSensorValue); if (packetBody[4] == 0xFE && packetBody[5] == 0xFE) { Monitor.Enter(LaserError); LaserError[0] = true; Monitor.Exit(LaserError); Monitor.Enter(LaserValue); LaserValue[0] = 0; Monitor.Exit(LaserValue); } else { Monitor.Enter(LaserError); LaserError[0] = false; Monitor.Exit(LaserError); Monitor.Enter(LaserValue); LaserValue[0] = (ushort)((packetBody[5] << 8) | packetBody[4]); Monitor.Exit(LaserValue); } if (packetBody[6] == 0xFE && packetBody[7] == 0xFE) { Monitor.Enter(LaserError); LaserError[1] = true; Monitor.Exit(LaserError); Monitor.Enter(LaserValue); LaserValue[1] = 0; Monitor.Exit(LaserValue); } else { Monitor.Enter(LaserError); LaserError[1] = false; Monitor.Exit(LaserError); Monitor.Enter(LaserValue); LaserValue[1] = (ushort)((packetBody[7] << 8) | packetBody[6]); Monitor.Exit(LaserValue); } } else { centralBoardCom.Purge(FTDI.FT_PURGE.FT_PURGE_RX); } }
static void Main(string[] args) { UInt32 ftdiDeviceCount = 0; FTDI.FT_STATUS ftStatus = FTDI.FT_STATUS.FT_OK; // Create new instance of the FTDI device class FTDI myFtdiDevice = new FTDI(); // Determine the number of FTDI devices connected to the machine ftStatus = myFtdiDevice.GetNumberOfDevices(ref ftdiDeviceCount); // Check status if (ftStatus == FTDI.FT_STATUS.FT_OK) { Console.WriteLine("Number of FTDI devices: " + ftdiDeviceCount.ToString()); Console.WriteLine(""); } else { // Wait for a key press Console.WriteLine("Failed to get number of devices (error " + ftStatus.ToString() + ")"); Console.ReadKey(); return; } // If no devices available, return if (ftdiDeviceCount == 0) { // Wait for a key press Console.WriteLine("Failed to get number of devices (error " + ftStatus.ToString() + ")"); Console.ReadKey(); return; } // Allocate storage for device info list FTDI.FT_DEVICE_INFO_NODE[] ftdiDeviceList = new FTDI.FT_DEVICE_INFO_NODE[ftdiDeviceCount]; // Populate our device list ftStatus = myFtdiDevice.GetDeviceList(ftdiDeviceList); if (ftStatus == FTDI.FT_STATUS.FT_OK) { for (UInt32 i = 0; i < ftdiDeviceCount; i++) { Console.WriteLine("Device Index: " + i.ToString()); Console.WriteLine("Flags: " + String.Format("{0:x}", ftdiDeviceList[i].Flags)); Console.WriteLine("Type: " + ftdiDeviceList[i].Type.ToString()); Console.WriteLine("ID: " + String.Format("{0:x}", ftdiDeviceList[i].ID)); Console.WriteLine("Location ID: " + String.Format("{0:x}", ftdiDeviceList[i].LocId)); Console.WriteLine("Serial Number: " + ftdiDeviceList[i].SerialNumber.ToString()); Console.WriteLine("Description: " + ftdiDeviceList[i].Description.ToString()); Console.WriteLine(""); } } // Open first device in our list by serial number ftStatus = myFtdiDevice.OpenBySerialNumber(ftdiDeviceList[1].SerialNumber); if (ftStatus != FTDI.FT_STATUS.FT_OK) { // Wait for a key press Console.WriteLine("Failed to open device (error " + ftStatus.ToString() + ")"); Console.ReadKey(); return; } // Set up device data parameters // Set Baud rate to 9600 ftStatus = myFtdiDevice.SetBaudRate(9600); if (ftStatus != FTDI.FT_STATUS.FT_OK) { // Wait for a key press Console.WriteLine("Failed to set Baud rate (error " + ftStatus.ToString() + ")"); Console.ReadKey(); return; } // Set data characteristics - Data bits, Stop bits, Parity ftStatus = myFtdiDevice.SetDataCharacteristics(FTDI.FT_DATA_BITS.FT_BITS_8, FTDI.FT_STOP_BITS.FT_STOP_BITS_1, FTDI.FT_PARITY.FT_PARITY_NONE); if (ftStatus != FTDI.FT_STATUS.FT_OK) { // Wait for a key press Console.WriteLine("Failed to set data characteristics (error " + ftStatus.ToString() + ")"); Console.ReadKey(); return; } // Set flow control - set RTS/CTS flow control ftStatus = myFtdiDevice.SetFlowControl(FTDI.FT_FLOW_CONTROL.FT_FLOW_NONE,0,0); if (ftStatus != FTDI.FT_STATUS.FT_OK) { // Wait for a key press Console.WriteLine("Failed to set flow control (error " + ftStatus.ToString() + ")"); Console.ReadKey(); return; } // Set read timeout to 5 seconds, write timeout to infinite ftStatus = myFtdiDevice.SetTimeouts(5000, 0); if (ftStatus != FTDI.FT_STATUS.FT_OK) { // Wait for a key press Console.WriteLine("Failed to set timeouts (error " + ftStatus.ToString() + ")"); Console.ReadKey(); return; } // Perform loop back - make sure loop back connector is fitted to the device // Write string data to the device string dataToWrite = "Hello world!"; UInt32 numBytesWritten = 0; // Note that the Write method is overloaded, so can write string or byte array data ftStatus = myFtdiDevice.Write(dataToWrite, dataToWrite.Length, ref numBytesWritten); myFtdiDevice.Purge(FTDI.FT_PURGE.FT_PURGE_TX); if (numBytesWritten != dataToWrite.Length) { Console.WriteLine("Error writting"); Console.Read(); return; } if (ftStatus != FTDI.FT_STATUS.FT_OK) { // Wait for a key press Console.WriteLine("Failed to write to device (error " + ftStatus.ToString() + ")"); Console.ReadKey(); return; } // Check the amount of data available to read // In this case we know how much data we are expecting, // so wait until we have all of the bytes we have sent. UInt32 numBytesAvailable = 0; do { ftStatus = myFtdiDevice.GetRxBytesAvailable(ref numBytesAvailable); //Console.WriteLine(ftStatus + " " + numBytesAvailable); if (ftStatus != FTDI.FT_STATUS.FT_OK) { // Wait for a key press Console.WriteLine("Failed to get number of bytes available to read (error " + ftStatus.ToString() + ")"); Console.ReadKey(); return; } Thread.Sleep(10); } while (numBytesAvailable < dataToWrite.Length); // Now that we have the amount of data we want available, read it string readData; UInt32 numBytesRead = 0; // Note that the Read method is overloaded, so can read string or byte array data ftStatus = myFtdiDevice.Read(out readData, numBytesAvailable, ref numBytesRead); if (ftStatus != FTDI.FT_STATUS.FT_OK) { // Wait for a key press Console.WriteLine("Failed to read data (error " + ftStatus.ToString() + ")"); Console.ReadKey(); return; } Console.WriteLine(readData); // Close our device ftStatus = myFtdiDevice.Close(); // Wait for a key press Console.WriteLine("Press any key to continue."); Console.ReadKey(); return; }
void ConnectFTDI() { UInt32 DeviceCount = 0; FTDI.FT_STATUS ftStatus = FTDI.FT_STATUS.FT_OK; // Create new instance of the FTDI device class ftdi = new FTDI(); // Determine the number of FTDI devices connected to the machine ftStatus = ftdi.GetNumberOfDevices( ref DeviceCount ); // Check status if(ftStatus != FTDI.FT_STATUS.FT_OK || DeviceCount == 0) { commStat = CommStatus.NoDevices; return; } commStat = CommStatus.NoElev8; // Allocate storage for device info list FTDI.FT_DEVICE_INFO_NODE[] DeviceList = new FTDI.FT_DEVICE_INFO_NODE[DeviceCount]; try { // Populate our device list ftStatus = ftdi.GetDeviceList( DeviceList ); bool FoundElev8 = false; for(int i = 0; i < DeviceCount && FoundElev8 == false; i++) { if(DeviceList[i].Type != FTDI.FT_DEVICE.FT_DEVICE_X_SERIES) continue; ftStatus = ftdi.OpenBySerialNumber( DeviceList[i].SerialNumber ); if(ftStatus == FTDI.FT_STATUS.FT_OK) { string portName; ftdi.GetCOMPort( out portName ); if(portName == null || portName == "") { ftdi.Close(); continue; } ftdi.SetBaudRate( 115200 ); ftdi.SetDataCharacteristics( 8, 1, 0 ); ftdi.SetFlowControl( FTDI.FT_FLOW_CONTROL.FT_FLOW_NONE, 0, 0 ); txBuffer[0] = (byte)0xff; // Send 0xff to the Prop to see if it replies uint written = 0; for(int j = 0; j < 10 && FoundElev8 == false; j++) // Keep pinging until it replies, or we give up { ftdi.Write( txBuffer, 1, ref written ); System.Threading.Thread.Sleep( 50 ); uint bytesAvail = 0; ftdi.GetRxBytesAvailable( ref bytesAvail ); // How much data is available from the serial port? if(bytesAvail > 0) { uint bytesRead = 0; ftdi.Read( rxBuffer, 1, ref bytesRead ); // If it comes back with 0xE8 it's the one we want if(bytesRead == 1 && rxBuffer[0] == 0xE8) { FoundElev8 = true; commStat = CommStatus.Connected; break; } } } if(FoundElev8) { break; } else { ftdi.Close(); } } } } catch(Exception) { return; } Active = true; if( ftdi.IsOpen ) { currentMode = (Mode)(tcMainTabs.SelectedIndex + 1); txBuffer[0] = (byte)currentMode; uint written = 0; ftdi.Write( txBuffer, 1, ref written ); // Which mode are we in? } // Start my 'tick timer' - It's set to tick every 20 milliseconds // (used to check the comm port periodically instead of using a thread) //tickTimer.Start(); }