0 / 0 / 0
Регистрация: 26.06.2017
Сообщений: 19
1

Ft232. обратный пакет

05.12.2018, 21:34. Показов 406. Ответов 3
Метки нет (Все метки)

в общем, суть такая. есть свисток Ftdi232Rl. Ноги Rx и Tx объедены перемычкой. Посылаю данные.
Если посылаю 1 байт(к примеру, 0х51),то читается нормально, проблем не возникает.
Как только начинаю слать много данных, к примеру (BufferSend[] = { 'z','x','c','v','b','n','m'}начинаются проблемы.
При приеме начинает откуда-то браться ещё 1 байт. и становится он всегда под номером 0. т.е. становится "zzxcvbnm" или "сzxcvbnm", или "bzxcvbnm" и тому подобное.

Может кто подсказать, было ли у него такое?!

И/К:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/* Includes ------------------------------------------------------------------*/
#include <iostream>
#include <windows.h>                //all_lib
#include <process.h>                
#include <string>                   //строки
#include "ftd2xx.h"                 //ft232_lib
#include "stdafx.h"                 
using namespace std;
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void FTDI_Config();
void FTDI_ID(void);
void helper(void);
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* Programm_conf ------------------------------------------------------------*/
//char BufferSend[] = { "ZXCVBNML"}; //'\0'
char BufferSend[] = { 'z','x','c','v','b','n','m'}; //'\0'
char BufferRead[] = { 0 };
char Recieve_buf[] = { 0 };
 
DWORD SendBuffer;                                   
DWORD ReadBuffer;
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* FTDI_232RL_conf ---------------------------------------------------------*/
FT_HANDLE ftHandle;                                     //к чему обращаемся
FT_STATUS ftStatus;                                     //опрашиваемый флаг-статус
DWORD numDevs;                                          //кол-во подключенных девайсов
FT_DEVICE_LIST_INFO_NODE *devInfo;                      //характеристики
 
DWORD BytesWritten;                                     //кол-во передаваемых байт
DWORD BytesReceived;                                    //кол-во принимаемых байт
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* Main Funcion ---------------------------------------------------------*/
int main()
{
    //настройки порта
    FTDI_ID();
    FTDI_Config();
 
    //Копируем массив для передачи, проверяем,всё ли скопировалось 
    memcpy(Recieve_buf, BufferSend, sizeof(BufferSend));  //sizeof(uint8_t)* SendBuffer);
    cout << ">>BufferSend =" << BufferSend << endl;
    cout << ">>Recieve_buf=" << Recieve_buf << endl;
 
    while (1)
    {
 
        //Чистим регистры перед передачей
        ftStatus = FT_Open(0, &ftHandle);
        if (ftStatus != FT_OK) { cout << " FT_Open failed " << endl; return 0; }
        else { cout << "FT_Open... " << endl; }
 
        //Очистка регистра Tx
        if (FT_Purge(ftHandle, FT_PURGE_TX) != FT_OK) { cout << "FT_Purge failed" << endl; exit(0); }
        else { cout << "FT_Purge_TX OK" << endl; }
        //Очистка регистра Rx
        if (FT_Purge(ftHandle, FT_PURGE_RX) != FT_OK) { cout << "FT_Purge failed" << endl; exit(0); }
        else { cout << "FT_Purge_RX OK" << endl; }
 
        cout << "FT_Close... " << endl;
        FT_Close(ftHandle);
 
 
        //Запись пакета в порт
        ftStatus = FT_Open(0, &ftHandle);
        if (ftStatus != FT_OK) { cout << " FT_Open failed " << endl; return 0; }
        else { cout << "FT_Open... " << endl; }
 
        //Запись
        ftStatus = FT_Write(ftHandle, &BufferSend, sizeof(BufferSend), &BytesWritten);
        if (ftStatus != FT_OK) { cout << "FT_Write Failed\n\r" << endl; return 0; }
        else { cout << ">>BufferSend=" << BufferSend << endl; }
 
 
        //чтение ответа из порта
        ftStatus = FT_Read(ftHandle, &BufferRead, sizeof(BufferRead), &BytesReceived);
        if (ftStatus != FT_OK) { cout << "FT_Write Failed\n\r " << endl; return 0; }
        else { cout << ">>BufferRead=" << BufferRead << endl; }
 
        cout << "FT_Close... " << endl;
        FT_Close(ftHandle);
 
        Sleep(100);
    }
    system("pause");
    return(0);
 
}
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* FTDI_ID Funcion ---------------------------------------------------------*/
void FTDI_ID(void)
{
    //Напечатать на экране хар-ки подключенных устройств
    cout << "===================================================" << endl;
    ftStatus = FT_CreateDeviceInfoList(&numDevs);
    if (ftStatus == FT_OK) { printf("OnLine Device = %d\n", numDevs); }
    if (numDevs > 0)
    {
        devInfo = (FT_DEVICE_LIST_INFO_NODE*)malloc(sizeof(FT_DEVICE_LIST_INFO_NODE)*numDevs);
 
        ftStatus = FT_GetDeviceInfoList(devInfo, &numDevs);
        if (ftStatus == FT_OK)
        {
            for (int i = 0; i < numDevs; i++)
            {
                printf("Dev Number %d:\n", i); //первый девайс под номер 0.
                printf(" ID=0x%x\n", devInfo[i].ID);
                printf(" LocId=0x%x\n", devInfo[i].LocId);
                printf(" SerialNumber=%s\n", devInfo[i].SerialNumber);
                cout << "===================================================" << endl;
                //ID = 0x4036001
                //LocId = 0x21
                //SerialNumber = A50285BI
            }
        }
    }
}
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* FTDI_Config Funcion ---------------------------------------------------------*/
void FTDI_Config()
{
    //Настройка Устройства
    if (FT_Open(0, &ftHandle) == FT_OK)
    {cout << "Device Config: FT_Open OK" << endl;}
    else { cout << "Device Config: ERROR" << endl; exit(0); }
 
    //Настройка скорости передачи
    if (FT_SetBaudRate(ftHandle, 9600) == FT_OK)
    {cout << "Baud rate = 9600" << endl;}
    else { cout << "SET ERROR" << endl; exit(0); }
 
    //Настройка кол-ва передаваемых бит, стоповый бит, четности
    if (FT_SetDataCharacteristics(ftHandle, FT_BITS_8, FT_STOP_BITS_1, FT_PARITY_NONE) == FT_OK)
    {cout << "Bits = 8" << endl;  cout << "STOP_Bits = 1" << endl; cout << "PARITY = none" << endl;}
    else { cout << "SET ERROR in configured" << endl; exit(0); }
    
    FT_Close(ftHandle);
    cout << "===================================================" << endl;
 
}
/*----------------------------------------------------------------------------*/
желтым помечено - что копирование буфера прошло норм.
красным - что в итоге прилетает назад в порт
https://yadi.sk/i/zNYg5GxKS-yfNw
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2018, 21:34
Ответы с готовыми решениями:

Найти правый обратный, левый обратный и обратный оператор
Здравствуйте! Если существует, то найти: правый обратный, левый обратный и обратный оператор....

Почему если отправить пакет UDP и конечного адресата в сети не существует, то пакет не отправляется?
Добрый день! Вопрос для расширения кругозора. Мониторю свой трафик с помощью WireShark и...

Как определить, какой из подсетей принадлежит пакет IP-пакет?
То есть у Олиферов это всё подробно расписано. Если маршрутизация сделана на основе масок, то надо...

Контрафакт FT232
Здравствуйте, господа. Один очень известный нигазин радиодеталей вовсю втюхивает контрафактные...

3
Нарушитель
8563 / 4518 / 1045
Регистрация: 12.03.2015
Сообщений: 21,219
05.12.2018, 21:54 2
Я тоже занимаюсь такими вещами. Для тестирования соединения и передачи данных использую левую спецпрограмму. Если с ней всё нормально передаётся и принимается, то значит это я накосячил.

Ты чо юзаешь для этих целей?
0
0 / 0 / 0
Регистрация: 26.06.2017
Сообщений: 19
05.12.2018, 22:27  [ТС] 3
Любой из доступных Терминалов, как вариант - Terminal1_9_b. и да, на большей скорости и когда длиннее массив действительно передается всё правильно.
но тут не ясно где косяк - потому как, как написано в оф.документации - открыть порт, прочитать, закрыть. всё так и сделал. а результат.....
0
Нарушитель
8563 / 4518 / 1045
Регистрация: 12.03.2015
Сообщений: 21,219
05.12.2018, 22:42 4
Цитата Сообщение от sadkoo Посмотреть сообщение
но тут не ясно где косяк
С теми же параметрами порта и таймаутами, но без твоей программы, обмен идёт с ошибками или нет?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2018, 22:42
Помогаю со студенческими работами здесь

Программатор на FT232
Собственно вот) Такая красивая пайка получилась после пары глотков хлорного железа) Программатор...

sim900 и ft232
Народ спасите от мусора в интернете! Суть вот в чем: Требуется подключить модуль sym900 к...

Не работает программатор на FT232
Собрал я себе программатор на базе FT232...

Замена MAX232 на FT232
Здравствуйте. Решил собрать универсальный программатор http://asutp74.narod.ru/. Хочу вместо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru