我尝试了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;
}
答案 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
来解决此问题,但请注意,如果您采用这种方法,则必须处理字节序问题。