C Arduino медленная последовательная связь

#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. Вы постоянно открываете и закрываете порт? Зачем вам это делать?