Отправлять int вместо символов ASCII при использовании C ++ для последовательной связи - PullRequest
2 голосов
/ 16 сентября 2011

Я попробовал код Serial.cpp с сайта Arduino .

Я только что сделал пару изменений и получил код, работающий должным образом.Однако проблема в том, что код C ++ последовательно отправляет значения ASCII, а не целые числа.Например, если я отправляю «5», я получаю 53 на стороне получателя.

Я попытался изменить тип буфера на int вместо char, но он вернул сообщение об ошибке:

ошибка C2664: «ReadFile»: невозможно преобразовать параметр 2 из «int» в «LPVOID»

Существует ли способ последовательной отправки целых чисел вместо значений ASCII?

Ниже приведен фрагмент кода.

bool Serial::WriteData(char *buffer, unsigned int nbChar)
{
    DWORD bytesSend;

    //Try to write the buffer on the Serial port
    if (!WriteFile(this->hSerial, (void *)buffer, nbChar, &bytesSend, 0))
    {
        //In case it don't work get comm error and return false
        ClearCommError(this->hSerial, &this->errors, &this->status);

        return false;
    }
    else
        return true;
}


int main() {
    // Convert from char* to wchar*

    char *name_ser="COM7";
    cout << name_ser << "(char*)" << endl;
    size_t origsize=strlen(name_ser)+1;
    const size_t newsize=100;
    size_t convertedChars=0;
    wchar_t wcstring[newsize];
    mbstowcs_s(&convertedChars, wcstring, origsize, name_ser, _TRUNCATE);
    wcscat_s(wcstring, L"(wchar_t*)");
    wcout<<wcstring<<endl;

    Serial serial(wcstring);

    if (serial.IsConnected()){
        while (1){
            char *chr0 = "5";
            serial.WriteData(chr0,1);
            cout<<chr0<<endl;
        }
    }
    system("pause");
    return 0;
}

Ответы [ 3 ]

1 голос
/ 16 сентября 2011

Я наконец-то понял, как это сделать.Это изменение, которое я сделал в коде ...

bool Serial::WriteData(int buffer, unsigned int nbChar)
{
    DWORD bytesSend;
    if (!WriteFile(this->hSerial, (LPVOID)&buffer, nbChar, &bytesSend, 0))
    {

        ClearCommError(this->hSerial, &this->errors, &this->status);
        return false;
    }
    else
        return true;
}

Итак, в конечном итоге мне пришлось объявить буфер как LPVOID в функции записи, и я напрямую передал десятичные значения без необходимости какого-либо другого преобразования,ура !!!

serial.WriteData(15,1);
0 голосов
/ 16 сентября 2011

Я не знаком напрямую с последовательными функциями Windows, но что-то вроде этого может сработать:

bool Serial::WriteInt8(int number)
{
    unsigned char n = (unsigned char) number;
    DWORD bytesSend;
    if(!WriteFile(this->hSerial, &n, sizeof(n), &bytesSend, 0)) {
        ClearCommError(this->hSerial, &this->errors, &this->status);
        return false;
    }
    return true;
}

Обратите внимание, что это будет вести себя некорректно, если вы попытаетесь отправить число больше 255, так как это наибольшее значение, которое может быть представлено в виде одного байта. Вы можете исправить это, изменив тип n на unsigned short, но имейте в виду, что вам придется решать проблемы с порядком байтов, если вы выберете такой подход.

0 голосов
/ 16 сентября 2011

Возможно, вам потребуется изменить сигнатуру метода.Попробуйте что-то вроде этого:

bool Serial::WriteData(int * buffer, unsigned int length)
{
    DWORD bytesSend;
    if(!WriteFile(this->hSerial, (void *)buffer, length*sizeof(int), &bytesSend, 0))
    {
        ClearCommError(this->hSerial, &this->errors, &this->status);
        return false;
    }
    else
        return true;
}

Вам нужно будет восстановить целые числа на Arduino: int s, как правило, 4 байта, и я ожидаю, что процедуры приема Arduino ожидают ASCII по умолчанию.

...