使用C ++进行串行通信时,发送'int'而不是ASCII字符

时间:2011-09-16 03:25:44

标签: visual-c++ serial-port arduino

我尝试了the Serial.cpp code from Arduino's website

我刚做了一些更改,并使代码正常工作。但是,问题是,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 个答案:

答案 0 :(得分:1)

我终于想出了如何做到这一点。这是我对代码所做的修改......

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;
}

所以,最终我必须在write函数中将缓冲区声明为LPVOID 我直接传输十进制值,无需任何其他转换。 YIPPEE !!!

serial.WriteData(15,1);

答案 1 :(得分:0)

您可能需要更改方法签名。尝试这样的事情:

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。

答案 2 :(得分:0)

我并不直接熟悉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来解决此问题,但请注意,如果您采用这种方法,则必须处理字节序问题。