我正在尝试将十六进制字节发送到串行 com 端口。问题是发送命令的段显然需要系统字符串而不是整数(错误 C2664“无法将参数 1 从‘int’转换为‘System::String ^’)。我一直在寻找一种方法来发送一个取而代之的是整数,但没有运气。(我尝试发送十六进制值的字符串表示,但设备无法识别这些命令)
代码主要部分
private: System::Void poll_Click(System::Object^ sender, System::EventArgs^ e)
{
int i, end;
double a = 1.58730159;
String^ portscan = "port";
String^ translate;
std::string portresponse [65];
std::fill_n(portresponse, 65, "Z");
for (i=1;i<64;i++)
{
if(this->_serialPort->IsOpen)
{
// Command 0 generator
int y = 2;
y += i;
int command0[10] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, dectohex(i), 0x00, 0x00, dectohex(y)};
for (end=0;end<10;end++)
{
this->_serialPort->WriteLine(command0[end]);
}
translate = (this->_serialPort->ReadLine());
MarshalString(translate, portresponse [i]);
if(portresponse [i] != "Z")
{
comboBox7->Items->Add(i);
}
this->progressBar1->Value=a;
a += 1.58730159;
}
}
}
这是函数 dectohex:
int dectohex(int i)
{
int x = 0;
char hex_array[10];
sprintf (hex_array, "0x%02X", i);
string hex_string(hex_array);
x = atoi(hex_string.c_str());
return x;
}
这就是解决我的问题的方法,由 Jochen Kalmbach 提供
auto data = gcnew array<System::Byte> { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0xBF, 0x00, 0x00, 0xBD };
_serialPort->Write(data, 0, data->Length);
替换了这个
this->_serialPort->WriteLine(command0[end]);
最佳答案
您不能通过串行线路发送整数....您只能发送 BYTES(7-8 位)!
你需要选择你想做什么:
发送的字符:所以“数字”12会被转换成字节
_serialPort->Write(12.ToString()); // => 0x49, 0x50
将整数(4 字节)作为小端发送
auto data = System::BitConverter::GetBytes(12); _serialPort->Write(data, 0, data->Length); // => 0x0c, 0x00, 0x00, 0x00
或者你只写一个字节:
auto data = gcnew array<System::Byte> { 12 }; _serialPort->Write(data, 0, data->Length); // => 0x0c
或者写一个字节数组:
auto data = gcnew array<System::Byte> { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0xBF, 0x00, 0x00, 0xBD }; _serialPort->Write(data, 0, data->Length); // => 0xFF 0xFF 0xFF 0xFF 0xFF 0x02 0xBF 0x00 0x00 0xBD
关于c++ - 将十六进制字节发送到串行端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18103779/