Инициализация связи через последовательный порт

В то время мы пытаемся создать интерфейс для последовательной связи, чтобы иметь возможность общаться с микропроцессором.

На самом деле — все работает отлично. Почти!
Чтобы иметь возможность общаться с нашим контроллером, нам нужно синхронизироваться с ним. Для этого мы пишем строку: "?0{SY}13!"и контроллер должен затем ответить "!0{SY}F5?" принять запрос на синхронизацию.
Для этого мы используем writeData функция (которая работает — мы знаем, что с помощью echo), и после этого мы используем readData читать ответ.
Проблема в том, что по какой-то причине он ничего не прочитает. Хотя и возвращается 1 для успеха, символы, которые он читает, постоянно " " (ничего такого).

Теперь начинается странная часть: если мы используем внешнюю терминальную программу для инициализации порта (например, putty), а затем закрываем программу, то все работает нормально. Он принимает запрос синхронизации, отвечает (и мы можем его прочитать), а затем мы можем делать все, что хотим. Но если мы не используем внешнюю программу для инициализации порта, она не будет работать.

Конструктор для инициализации интерфейса выглядит так:

SerialIF::SerialIF(int baud, int byteSize, int stopBits, char* parity, int debug)
{
string coutport = getPort();
wstring wideport;
debug_ = debug;                 //Debuglevel

sync = false;                   //sync starts with false

error = false;                  //Error false as beginnging

//this is just for converting to the right type
for (int i = 0; i < coutport.length(); i++)
{
wideport += wchar_t(coutport[i]);
}
const wchar_t* port = wideport.c_str();

SerialIF::hserial = CreateFile(port,
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if (hserial == INVALID_HANDLE_VALUE)
{
if (GetLastError() == ERROR_FILE_NOT_FOUND)
{
if (debug_ != LOW)
{
cout << "[-] Port " << coutport << "doesn't exist." << endl;
}
}

if (debug_ != LOW)
{
cout << "[-] Handle error - is there another terminal active?" << endl;
}
error = true;
}

DCB dcbParms = { 0 };
dcbParms.DCBlength = sizeof(dcbParms);

if (!GetCommState(hserial, &dcbParms))
{
if (debug_ != LOW)
{
cout << "[-] Couldn't get status from port " << coutport << endl;
}
error = true;
}

if (!error)
{
setBaud(dcbParms, baud);
setParity(dcbParms, parity);
setByteSize(dcbParms, byteSize);
setStopbits(dcbParms, stopBits);

if (debug_ == HIGH)
{
cout << "[+] Serial port " << coutport << " has been activated. \nBaud-rate: " << baud << "\nParity: "<< parity << "\nStop bits: " << stopBits << endl;
}
}
else if (debug_ != LOW)
{
cout << "[-] Port not initialized" << endl;
}
}

Это должно работать — я действительно не знаю, почему это не должно. Он не возвращает ошибок, я пробовал ОЧЕНЬ много ошибок при поиске за последние пару дней, я пробовал тайм-ауты, я пробовал другие способы его построения, но все сводится к той же проблеме.

Почему это не инициализирует порт?

РЕДАКТИРОВАТЬ:

Вывод при попытке синхронизации:
Не могу опубликовать фотографии из-за отсутствия репутации. хотя он выдает следующее:

[+] Последовательный порт COM1 активирован.
Скорость передачи данных: 9600
Четность: НЕТ
Стоп биты: 1

[+] ->? 0 {SY} 13! написано в порт.
((И это то, где он входит в чтение бесконечного цикла «»))

РЕДАКТИРОВАТЬ: код для чтения:

const int bytesToRead = 1;              //I byte pr læsning
char buffer[bytesToRead + 1] = { 0 };   //Bufferen til data
DWORD dwBytesRead = 0;                  //Antal bytes læst
string store;                           //Store - den vi gemmer den samlede streng i
bool end = false;                       //Kontrolvariabel til whileloop.

while (end == false)
{
if (ReadFile(hserial, buffer, bytesToRead, &dwBytesRead, NULL))
/*Readfile læser fra interfacet vha. hserial som vi oprettede i constructoren*/
{
if (buffer[0] == '?')           //Da protokollen slutter en modtaget streng med "?", sætter vi end til true
{                               //Hvis denne læses.
end = true;
}
store += buffer[0];
}
else
{
if (debug_ != LOW)
{
cout << "[-] Read fail" << endl;    //Hvis readfile returnerer false, så er der sket en fejl.
}
end = true;
}
}

if (debug_ == HIGH)
{
cout << "[+] Recieved: " << store << endl;  //I forbindelse med debug, er det muligt at få udsrkevet det man fik ind.
}

recentIn = store;                               //RecentIN brugES i andre funktioner
if (verify())                                   //Som f.eks. her, hvor vi verificerer dataen
{
if (debug_ == HIGH)
{
cout << "[+] Verification success!" << endl;
}
return convertRecData(store);
}
else
{
if (debug_ != LOW)
{
cout << "[-] Verification failed." << endl;
}

vector <string> null;   //Returnerer en string uden data i, hvis der er sket en fejl.
return null;
}

3

Решение

Ты никогда не звонишь SetCommState,

Я не уверен, где твои функции setBaud,setParity и т.д., но я не вижу, как они могут модифицировать последовательный порт, поскольку у них нет доступа к дескриптору устройства связи.

0

Другие решения

ReadFile () может вернуть успех, даже когда считываются нулевые байты. Используйте dwBytesRead, чтобы узнать фактическое количество полученных символов.

while (ReadFile(hserial, buffer, 1, &dwBytesRead, NULL))
{
if (dwBytesRead != 0)
{
store += buffer[0];

if (buffer[0] == '?')
{
end = true;
break;
}
}
}
1

По вопросам рекламы [email protected]