#c #serial-port #arduino #processing
#c #последовательный порт #ардуино #обработка #c #arduino
Вопрос:
У меня есть гироскоп (MPU6050), подключенный к моему Arduino UNO. Я написал сценарий обработки для считывания последовательных данных (получения углов) с гироскопа, и он работает нормально. Теперь я хотел бы интегрировать его с проектом C OpenCV. Я использую этот обучающий класс для последовательной связи:http://playground.arduino.cc/Interfacing/CPPWindows
Однако последовательная связь осуществляется очень медленно, массив из 256 символов заполняется примерно за 1,5 секунды. Это около 170 символов в секунду = 1,36 кбит /с.
Итак, возникает вопрос: если последовательный порт работает быстро для обработки, то почему при использовании C он работает намного медленнее? Есть ли какой-либо альтернативный способ считывания данных гироскопа на C ?
Вот функция, которая запускается после каждого кадра, который я снимаю с веб-камеры, чтобы получить последовательные данные
int Serial::ReadandClose(char *buffer, unsigned int nbChar, const char* portName)
{
wchar_t wtext[20];
mbstowcs(wtext, portName, strlen(portName) 1);//Plus null
LPWSTR PortSpecifier = wtext;
DCB dcb;
int retVal;
BYTE Byte;
DWORD dwBytesTransferred;
DWORD dwCommModemStatus;
HANDLE hPort = CreateFile(
PortSpecifier,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
0,
NULL
);
if (!GetCommState(hPort,amp;dcb))
return 0x100;
dcb.BaudRate = CBR_115200;
dcb.ByteSize = 8; //8 data bits
dcb.Parity = NOPARITY; //no parity
dcb.StopBits = ONESTOPBIT; //1 stop
if (!SetCommState(hPort,amp;dcb))
return 0x100;
SetCommMask (hPort, EV_RXCHAR | EV_ERR); //receive character event
WaitCommEvent (hPort, amp;dwCommModemStatus, 0); //wait for character
if (dwCommModemStatus amp; EV_RXCHAR)
{
clock_t begin =clock();
ReadFile (hPort, buffer, 256, amp;dwBytesTransferred, 0);
clock_t end = clock();
double elapsed_secs = double(end-begin) / CLOCKS_PER_SEC;
cout<<elapsed_secs<<endl;
}
else if (dwCommModemStatus amp; EV_ERR)
retVal = 0x101;
CloseHandle(hPort);
return dwBytesTransferred;
}
Комментарии:
1. Я не работал с Arduino, но, потратив некоторое время на программирование подобных устройств, я бы посоветовал вам попробовать то же самое без деления и вычисления
elapsed_secs
. Возможно, это не главная проблема, но это может иметь значение.2. Спасибо за ваш ответ, но на самом деле измерение времени на самом деле не занимает так много времени, я включил этот код измерения времени, чтобы показать, что я измеряю время только функции ReadFile, а не все процессы открытия и закрытия. Ценю вашу помощь, хотя
3. @user3791279 может быть, на самом деле это не отправка массива символов, вы сказали, что это было вызвано после визуальной обработки, может быть, просто визуальная обработка занимает много времени, а затем отправляет вам данные? Также необходимо ли каждый раз проверять состояние связи? Возможно, вы захотите попробовать считывание для другого датчика, для чтения которого требуется меньше времени, и посмотреть, является ли это проблемой.
4. На самом деле то же самое оборудование работает с другим программным обеспечением (обработка), поэтому arduino определенно отправляет символы, я измерил частоту кадров с последовательной связью и без нее, и, очевидно, большая часть времени тратится на последовательную связь, а не на обработку изображений (что на самом деле должно быть наоборот)
5. Вы постоянно открываете и закрываете порт? Зачем вам это делать?