Benutzer mit den meisten Antworten
Daten über USB senden

Frage
-
Hallo,
mir stellt sich mal wieder eine Frage: Ich möchte Daten über USB an einen FTDI Chip und danach an einen Atmel Controller senden. Die entsprechende FTDI dll habe ich als Verweis im Programm. Ich weiß, das der Baustein schon mal erkannt wird, aber es werden keine Daten gesendet. Das Programm springt immer in die letzte if Funktion. Könnte mir jemand sagen, wo ich den Fehler habe? Vielen Dank für eure Hilfe
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading; using FTD2XX_NET; namespace Test_USB { public partial class Form1 : Form { // Create new instance of the FTDI device class FTDI myFtdiDevice = new FTDI(); FTDI.FT_STATUS ftStatus = FTDI.FT_STATUS.FT_OK; UInt32 numBytesWritten = 0; UInt32 numBytesToRead = 1; UInt32 numBytesRead = 0; byte[] dataBytes = new byte[5]; public Form1() { InitializeComponent(); ftStatus = myFtdiDevice.SetBaudRate(9600); ftStatus = myFtdiDevice.SetDataCharacteristics(FTDI.FT_DATA_BITS.FT_BITS_8, FTDI.FT_STOP_BITS.FT_STOP_BITS_1, FTDI.FT_PARITY.FT_PARITY_NONE); ftStatus = myFtdiDevice.SetFlowControl(FTDI.FT_FLOW_CONTROL.FT_FLOW_RTS_CTS, 0x11, 0x13); ftStatus = myFtdiDevice.SetTimeouts(5000, 0); }
private void btBausteinsuchen_Click(object sender, EventArgs e) // FTDI Chips erkennen
{
UInt32 ftdiDevCount = 0;
// Anzahl?
ftStatus = myFtdiDevice.GetNumberOfDevices(ref ftdiDevCount);
// Check status
if (ftStatus == FTDI.FT_STATUS.FT_OK)
{
MessageBox.Show("Anzahl gefundener Bausteine: " + ftdiDevCount.ToString());
}
else
{
MessageBox.Show("Failed to get number of devices: Error " + ftStatus.ToString());
}
} private void btSenden_Click(object sender, EventArgs e) { byte[] bOut; uint iWritten = 0; int iCount = 1; bOut = new byte[1]; bOut[0] = Convert.ToByte(0x00); ftStatus = myFtdiDevice.Write(bOut, iCount, ref iWritten); if (ftStatus != FTDI.FT_STATUS.FT_OK) { MessageBox.Show("Failed getting bytes: Error " + ftStatus.ToString()); } } } }
Antworten
-
Hallo floribr
Also so wie ich das verstehe, nutzt Du das FTDI Teil als USB Seriel Konverter, das Du an die serielle Schnittstelle Deinen uC anschließt. Ich hoffe das habe ich korrekt verstanden?
Bei der Nutzung des FTDI Teils als serielle Schnittstelle hätte ich ehrlich gesagt die VCP Treiber verwendet, und nicht die D2XX:
http://www.ftdichip.com/Drivers/VCP.htm
Wenn Du die VCP Treiber installierst, hast Du auf einmal eine serielle Schnittstelle an Deinem PC, nämlich die des FTDI USB-Seriell Schnüffelstücks. Das tolle daran ist, dass Du dann die normale C# SerialPort Classe nutzen kannst.
Best regards
Bordon
Note: Posted code pieces may not have a good programming style and may not perfect. It is also possible that they do not work in all situations. Code pieces are only indended to explain something particualar.- Bearbeitet Bordon Freitag, 15. Januar 2016 07:00
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 22. Januar 2016 14:33
- Als Antwort markiert Aleksander Chalabashiev Montag, 1. Februar 2016 08:51
Alle Antworten
-
Hallo,
der btSenden Teil dürfte deswegen nicht funktionieren, weil Du das Gerät nicht geöffnet (und konfiguiert) hast.
Schau Dir mal die Beispiele auf der FTDI Seite an, z. B. das Loopback (Nr 3).
Gruß Elmar
-
Ich bin nun das Beispielprogramm Zeile für Zeile durchgegangen. In der Zeile
ftStatus = myFtdiDevice.GetDeviceList(ftdiDeviceList);
gibt er mir die Fehlermeldung:
"Ein Ausnahmefehler des Typs "FTD2XX_NET.FTDI.FT_EXCEPTION" ist in FTD2XX_NET.dll aufgetreten.
Zusätzliche Informationen: The supplied buffer is not big enough."
Wenn ich diese Zeile auskommentiere, kommt die gleiche Fehlermeldung in der nächsten Zeile:
ftStatus = myFtdiDevice.OpenBySerialNumber(ftdiDeviceList[0].SerialNumber);
Kommentiere ich beide aus, macht er nicht die Settings, wie Baudrate usw. Was bedeutet erstmal diese Fehlermeldung und was kann ich dagegen tun. Bei Bedarf kann ich auch noch mal den ganzen Code reinsetzen.
-
Hallo,
ich kann Dir dabei nicht großartig weiterhelfen, da ich keine FTDI Geräte hier habe.
Überprüfe mal den Wert die GetNumberOfDevices liefert, er sollte groß genug für alle installierten Geräte sein (meist wohl eins) - im Zweifelsfall vergrößere den Puffer ftdiDeviceList um einen.
Gruß Elmar
-
Hallo,
das Array um einen (oder mehr) größer machen, hier Zeile 46:
// Allocate storage for device info list FTDI.FT_DEVICE_INFO_NODE[] ftdiDeviceList = new FTDI.FT_DEVICE_INFO_NODE[ftdiDeviceCount + 1];
Wobei es sehr merkwürdig ist, das die Anzahl von der Zahl der gelieferten Geräte abweicht.
Gruß Elmar
-
Also die Initialisierung funktioniert schon mal. Jedenfalls kommen da keine Fehler mehr. Jetzt stellt sich mir die Frage, ob auch die richtigen Daten gesendet werden. Ich habe zwei Buttons eingefügt. Ein Button soll den Hexwert 0xA0 senden, der Andere 0xA1. Die Messageboxen sagen mir, das der Wert A0 und A1 gesendet werden. Ist das so richtig? Ich hätte jetzt in der Messagebon die Werte 0xA0 und 0xA1 erwartet.
private void btSenden_Click(object sender, EventArgs e) { byte input = 0xA0; string dataToWrite = String.Format("{0:X02}", input); UInt32 numBytesWritten = 0; ftStatus = myFtdiDevice.Write(dataToWrite, dataToWrite.Length, ref numBytesWritten); if (ftStatus == FTDI.FT_STATUS.FT_OK) { // Wait for a key press MessageBox.Show("Daten gesendet " + dataToWrite); } if (ftStatus != FTDI.FT_STATUS.FT_OK) { // Wait for a key press MessageBox.Show("Failed to write to device (error " + ftStatus.ToString() + ")"); } } private void button1_Click(object sender, EventArgs e) { byte input = 0xA1; string dataToWrite = String.Format("{0:X02}", input); UInt32 numBytesWritten = 0; ftStatus = myFtdiDevice.Write(dataToWrite, dataToWrite.Length, ref numBytesWritten); if (ftStatus == FTDI.FT_STATUS.FT_OK) { // Wait for a key press MessageBox.Show("Daten gesendet " + dataToWrite); } if (ftStatus != FTDI.FT_STATUS.FT_OK) { // Wait for a key press MessageBox.Show("Failed to write to device (error " + ftStatus.ToString() + ")"); } }
-
Hallo,
.NET Strings sind immer Unicode-Zeichenketten. Du willst aber vermutlich Steuercodes wie 0xA0, 0xA1 senden, die als ein Byte übertragen werden. Dann solltest Du sie direkt als Byte-Array übertragen. Die Write-Methode kennt eine Überladung dafür.
Auch bei anderen Zeichenketten verwende besser Encoding.GetBytes.
Gruß Elmar
-
ich weiß nicht, ob ich das alles verstanden habe. Muss ich nun nach einem "BitConverter" oder einem "BinaryWriter" suchen? Oder bin ich da nun total falsch? Ich habe mal das hier als BitConverter rausgesucht:
private void button1_Click(object sender, EventArgs e) { int[] values = { 0xA1 }; foreach (var value in values) { byte[] dataToWrite = BitConverter.GetBytes(value); UInt32 numBytesWritten = 0; ftStatus = myFtdiDevice.Write(dataToWrite, dataToWrite.Length, ref numBytesWritten); if (ftStatus == FTDI.FT_STATUS.FT_OK) { // Wait for a key press MessageBox.Show("Daten gesendet " + dataToWrite); } }
In der Messagebox wird aber nur "Daten gesendet System.Byte[]" angezeigt. Ziel ist eigentlich 0xA1
-
hab da noch was anderes gefunden, bei dem auf jeden Fall schon mal der gewünschte Wert in der Messagebox angezeigt wird.
public static string DecToHex(int decValue) { return string.Format("{0:X2}", decValue); } private void button1_Click(object sender, EventArgs e) { string dataToWrite = DecToHex(0xA1); UInt32 numBytesWritten = 0; ftStatus = myFtdiDevice.Write(dataToWrite, dataToWrite.Length, ref numBytesWritten); if (ftStatus == FTDI.FT_STATUS.FT_OK) { // Wait for a key press MessageBox.Show("Daten gesendet " + dataToWrite); } }
-
Hallo floribr
besteht jetzt Dein Problem noch?
Wenn ja, dann sag doch mal wie Dein FTDI Chip an Deinen Atmel angebunden ist. Von Deinem ersten Posting her hätte ich ja gesagt, Du hast einen FTDI USB-Seriell Konverter.
Best regards
Bordon
Note: Posted code pieces may not have a good programming style and may not perfect. It is also possible that they do not work in all situations. Code pieces are only indended to explain something particualar. -
Hallo,
nach langer Zeit habe ich mal wieder etwas Zeit zum basteln. Ja, das Problem besteht weiterhin. Und ja, es ist so ein Teil: FT232RL. Dieser ist über eine normale USB Buchse mit dem Rechner verbunden und am Atmel AT90CAN128 gehe ich auf den USART1. Es kann natürlich aber auch sein, das ich den Atmel nicht richtig pogrammiert habe. Aber da dies in C geschieht, dachte ich, dass das hier nicht hin gehört.
-
Hallo floribr
Also so wie ich das verstehe, nutzt Du das FTDI Teil als USB Seriel Konverter, das Du an die serielle Schnittstelle Deinen uC anschließt. Ich hoffe das habe ich korrekt verstanden?
Bei der Nutzung des FTDI Teils als serielle Schnittstelle hätte ich ehrlich gesagt die VCP Treiber verwendet, und nicht die D2XX:
http://www.ftdichip.com/Drivers/VCP.htm
Wenn Du die VCP Treiber installierst, hast Du auf einmal eine serielle Schnittstelle an Deinem PC, nämlich die des FTDI USB-Seriell Schnüffelstücks. Das tolle daran ist, dass Du dann die normale C# SerialPort Classe nutzen kannst.
Best regards
Bordon
Note: Posted code pieces may not have a good programming style and may not perfect. It is also possible that they do not work in all situations. Code pieces are only indended to explain something particualar.- Bearbeitet Bordon Freitag, 15. Januar 2016 07:00
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 22. Januar 2016 14:33
- Als Antwort markiert Aleksander Chalabashiev Montag, 1. Februar 2016 08:51