Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
24.03.2010, 16:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Re: Как программно организовать передачу и прием данных ft232
Был вариант на микрочип су - девайс ставится именно на то место, которое Вы ему уготовили
http://www.microchip.su/showthread.p...EF%F2%EE%F0%E5
Но это АСМ, я FTDI не пробовал.
Последний раз редактировалось urry; 24.03.2010 в 23:47.
|
|
|
|
24.03.2010, 18:31
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Как программно организовать передачу и прием данных ft232
Сообщение от urry
|
под линуксом, забирал данные через левый gsm шлюз
|
Вроде не об этом идёт разговор ... Но зато теперь все видят, что urry очень крут !
Сообщение от tusya83
|
не получается программно определить номер ком-порта, на который встала микросхема
|
Перебирайте все доступные ком-порты, посылая запросы, пока не получите нужный отклик от устройства.
И вообще, надо определиться, что будет использоваться: Windows API для ком-порта или FTDI функции из FTD2XX.DLL
|
|
|
|
24.03.2010, 19:53
|
|
Частый гость
Регистрация: 09.03.2010
Сообщений: 15
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как программно организовать передачу и прием данных ft232
Понятно. Большое спасибо за ответы. Будем добивать d2xx
|
|
|
|
24.03.2010, 22:28
|
|
Прописка
Регистрация: 11.04.2006
Сообщений: 197
Сказал спасибо: 80
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
|
Re: Как программно организовать передачу и прием данных ft232
Я чет не понял...почему у Вас с потоками не получается...у меня так все работает. Создаем поток и там опрашиваем функцию о наличии в буфере микры для нас байтиков. Если есть, то забираем с помощью FT_Read... делов то.
Вообщем сейчас куски повыхватываю...разбирайтесь сами...писано на Delphi:
function RXThreadFunc(Owner: TDMXRepeater): Integer;
begin
Result:= 0;
Owner.fKillRXThread:= False;
while not Owner.fKillRXThread and (SleepEX(1, False) = 0) do
begin
WaitForSingleObject(Owner.fRXEvent, INFINITE);
Owner.ThreadProc_RX;
end;
end;
function TXThreadFunc(Owner: TDMXRepeater): Integer;
begin
Result:= 0;
Owner.fKillTXThread:= False;
while not Owner.fKillTXThread and (SleepEX(1, False) = 0) do Owner.ThreadProc_TX;
end;
Вызывается из потока:
procedure TDMXRepeater.ThreadProc_RX;
var
TX, RX, Event: Cardinal;
Ret, rBytes: Integer;
RcvCmd, RcvData: Byte;
Change: Boolean;
begin
Ret:= FT_GetStatus(fDevHandle, @RX, @TX, @Event);
if (Ret ‹› 0) then Exit;
Ret:= FT_Read(fDevHandle, fRcvBuffer, RX, @rBytes);
if (Ret ‹› FT_OK) or (RX ‹› rBytes) then Exit;
end;
Инициализация (функции API и FTDI):
Res:= FT_Open(n, @fDevHandle); //тут N выбирается из подходящего по списку чипа
if Res ‹› FT_OK then
begin
Result:= srDeviceNotFound;
Exit;
end;
Res:= FT_ResetDevice(fDevHandle);
Res:= FT_Purge(fDevHandle, FT_Purge_RX or FT_Purge_TX);
Res:= FT_SetUSBParameters(fDevHandle, 512, 0);
fRXThrdHandle:= BeginThread(nil, 0, @RXThreadFunc, Pointer(Self), Create_Suspended, fRXThrdID);
if fRXThrdHandle = 0 then
begin
Result:= srUnknownError;
Exit;
end;
fTXThrdHandle:= BeginThread(nil, 0, @TXThreadFunc, Pointer(Self), Create_Suspended, fTXThrdID);
if fTXThrdHandle = 0 then
begin
Result:= srUnknownError;
Exit;
end;
fRXEvent:= CreateEvent(nil, False, False, '');
Res:= FT_SetEventNotification(fDevHandle, FT_Event_RXChar, fRXEvent);
SetThreadPriority(fRXThrdHandle, Thread_Priority_HIGHEST);
SetThreadPriority(fTXThrdHandle, Thread_Priority_HIGHEST);
ResumeThread(fRXThrdHandle);
ResumeThread(fTXThrdHandle);
Дерзайте...
|
|
|
|
24.03.2010, 23:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Re: Как программно организовать передачу и прием данных ft232
Сообщение от Yurkin2007
|
Сообщение от urry Посмотреть сообщение
под линуксом, забирал данные через левый gsm шлюз
Вроде не об этом идёт разговор ... Но зато теперь все видят, что urry очень крут !
|
Я извиняюсь за флуд - сейчас работаю в области, далекой от МК - но не за свое выражение о вредных советах. Дальнейшие разборки - в личку.
В делфи не пишу, в си++ где-то так
Код:
|
1. hPort = CreateFile( PortName,
2. GENERIC_READ | GENERIC_WRITE,
3. 0,
4. NULL,
5. OPEN_EXISTING,
6. FILE_FLAG_OVERLAPPED | FILE_ATTRIBUTE_SYSTEM,
7. NULL);
8.
9. if (hPort == INVALID_HANDLE_VALUE)
10. {
11. DumpError("CreateFile");
12. IsError = true;
13. return;
14. }
15.
16. if (!PurgeComm(hPort, PURGE_RXCLEAR | PURGE_TXCLEAR))
17. {
18. DumpError("PurgeComm");
19. IsError = true;
20. return;
21. }
22.
23. DCB dcb;
24. if (!GetCommState(hPort, &dcb))
25. {
26. DumpError("GetCommState");
27. IsError = true;
28. return;
29. }
30. dcb.DCBlength = sizeof(dcb);
31. dcb.BaudRate = dwBaudRate;
32. dcb.fBinary = true;
33. dcb.fParity = false;
34. dcb.fOutxCtsFlow = false;
35. dcb.fOutxDsrFlow = false;
36. dcb.fDtrControl = DTR_CONTROL_ENABLE;
37. dcb.fDsrSensitivity = false;
38. dcb.fTXContinueOnXoff = false;
39. dcb.fOutX = false;
40. dcb.fInX = false;
41. dcb.fNull = false;
42. dcb.fRtsControl = RTS_CONTROL_ENABLE;
43. dcb.fAbort:: onerror :: = true;
44. dcb.ErrorChar = 0xFF;
45. dcb.XonLim = 2048;
46. dcb.XoffLim = 512;
47. dcb.XonChar = 17;
48. dcb.XoffChar = 19;
49. dcb.EofChar = 0;
50. dcb.EvtChar = 0;
51. dcb.ByteSize = 8;
52. dcb.Parity = NOPARITY;
53. dcb.StopBits = ONESTOPBIT;
54. if (!SetCommState(hPort,&dcb))
55. {
56. DumpError("SetCommState");
57. IsError = true;
58. return;
59. }
60.
61. if (!SetupComm(hPort,2048,0))
62. {
63. DumpError("SetupComm");
64. IsError = true;
65. return;
66. }
67.
68. COMMTIMEOUTS cto;
69. if (!GetCommTimeouts(hPort,&cto))
70. {
71. DumpError("GetCommTimeouts");
72. IsError = true;
73. return;
74. }
75. cto.ReadIntervalTimeout = 0;
76. cto.ReadTotalTimeoutMultiplier = 0;
77. cto.ReadTotalTimeoutConstant = 0;
78. cto.WriteTotalTimeoutMultiplier = 0;
79. cto.WriteTotalTimeoutConstant = 0;
80. if (!SetCommTimeouts(hPort,&cto))
81. {
82. DumpError("SetCommTimeouts");
83. IsError = true;
84. return;
85. }
86.
87. if (!SetCommMask(hPort,EV_RXCHAR))
88. {
89. DumpError("SetCommMask");
90. IsError = true;
91. return;
92. }
93.
94. COMMCONFIG ccfg;
95. unsigned long cfgsize = sizeof(ccfg);
96. if (!GetCommConfig(hPort,&ccfg,&cfgsize))
97. {
98. DumpError("GetCommConfig");
99. IsError = true;
100. return;
101. }
102. ccfg.dwSize = cfgsize;
103. ccfg.dcb = dcb;
104. ccfg.dwProviderSubType = PST_RS232;
105. if (!SetCommConfig(hPort,&ccfg,cfgsize))
106. {
107. DumpError("SetCommConfig");
108. IsError = true;
109. return;
110. }
111. //-----------------------------------------------------
112. hEvtRead = CreateEvent(NULL,false,false,NULL);
113. hEvtWrite = CreateEvent(NULL,false,false,NULL);
114. memset(&ovRead,0,sizeof(ovRead));
115. memset(&ovWrite,0,sizeof(ovWrite));
116. ovRead.hEvent = hEvtRead;
117. ovWrite.hEvent = hEvtWrite;
//---------------------------------------------------------
// чтение
char buf[1000];
int num;
ReadFile(hPort,buf,1,&num,ovRead);
if (WaitForSingleObject(ovRead-›hEvent, ‹таймаут› ) != WAIT_OBJECT_0)
{
PurgeComm(hPort, PURGE_RXABORT);
//не уложились в таймаут
}
// запись
WriteFile(hPort,buf,bufsize,&num,ovWrite);
if (WaitForSingleObject(ovWrite-›hEvent,‹таймаут записи›) != WAIT_OBJECT_0)
{
PurgeComm(hPort, PURGE_TXABORT);
// не уложились в таймаут
} |
Последний раз редактировалось urry; 25.03.2010 в 00:24.
|
|
|
|
25.03.2010, 13:25
|
|
Частый гость
Регистрация: 09.03.2010
Сообщений: 15
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как программно организовать передачу и прием данных ft232
awtoap,
urry, большое спасибо. Сначала помучаю еще чуток FTD2XX, если не пойдет, буду разбираться с API как предложил urry.
|
|
|
|
25.03.2010, 13:59
|
|
Частый гость
Регистрация: 28.04.2007
Сообщений: 40
Сказал спасибо: 2
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
|
Re: Как программно организовать передачу и прием данных ft232
Сообщение от tusya83
|
подскажите пожалуйста.
Как правильно организовать постоянный мониторинг состояния порта, чтоб
|
Если пишите на Delphi посмотрите здесь - http://www.delphikingdom.ru/asp/view...catalogid=1126
|
|
|
|
25.03.2010, 14:09
|
|
Частый гость
Регистрация: 09.03.2010
Сообщений: 15
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как программно организовать передачу и прием данных ft232
Мне нужно на с++, но попробую разобраться
|
|
|
|
25.03.2010, 22:31
|
|
Прописка
Регистрация: 11.04.2006
Сообщений: 197
Сказал спасибо: 80
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
|
Re: Как программно организовать передачу и прием данных ft232
Я вам предложил на API (ищите одноименные функции в хелпе) без использования виртуального COM порта, а urry именно с COM портом. Максимальную скорость передачи данных получите только при работе с API функциями FTDI на прямую.
|
|
|
|
01.04.2010, 18:33
|
|
Частый гость
Регистрация: 28.04.2007
Сообщений: 40
Сказал спасибо: 2
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
|
Re: Как программно организовать передачу и прием данных ft232
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:27.
|
|