我正在编写一个vc ++ CLR表单项目,它将通过串口控制我的机器人。机器人需要ASCII命令如下:第一个字节是A和Z之间的字符,它确定要执行的命令,第二个字符是+或 - 符号,然后恰好有5个数字。如果要发送的数字少于5位,则在开头用零填充。
我正在使用System :: IO :: Ports :: SerialPort与COM端口进行通信,该端口具有以下原型:
public:
void Write(
array<wchar_t>^ buffer,
int offset,
int count
)
由于我需要填充数字,所以它正好是5位数,我使用的是sprintf。 (我还在学习c ++并且还没有很多使用String :: Format的经验,但我认为我可以轻松地做同样的事情 - 但是现在我想用这些数组来做,为了学习)。
sprintf返回wchar_t的字符串,我现在需要将这些wchar_t添加到&lt;数组&gt;传递给函数,但我找不到一个优雅的解决方案。我工作的解决方案,但for循环对我来说真的很讨厌:
int DeltaForm::setThetas(int th1, int th2, int th3)
{
// Cannot write more than 5 digits
if (th1 < 1000 && th2 < 1000 && th3 < 1000)
{
wchar_t commandBuffer[8];
array<wchar_t>^ buffer = gcnew array<wchar_t>(8);
_snwprintf_s(commandBuffer, 8, 7, L"B+%05d", th2*100);
for (int i = 0; i < 8; i++)
{
buffer->SetValue(commandBuffer[i], i);
}
this->serialComms->Write(buffer, 0, 7);
_snwprintf_s(commandBuffer, 8, 7, L"A+%05d", th1*100);
for (int i = 0; i < 8; i++)
{
buffer->SetValue(commandBuffer[i], i);
}
this->serialComms->Write(buffer, 0, 7);
_snwprintf_s(commandBuffer, 8, 7, L"C+%05d", th3*100);
for (int i = 0; i < 8; i++)
{
buffer->SetValue(commandBuffer[i], i);
}
this->serialComms->Write(buffer, 0, 7);
}
else
{
return 0;
}
}
我已经查看了数组类,但找不到任何可以帮助我的方法。是否有更简单,更优雅的方式来填充数组?
由于
答案 0 :(得分:2)
如果您将指针固定到数组,则可以原生对待它,例如:
array<wchar_t>^ buffer = gcnew array<wchar_t>(8);
pin_ptr<wchar_t> p = &buffer[0];
_snwprintf_s(p, 8, 7, L"B+%05d", th2*100);
this->serialComms->Write(buffer, 0, 7);
我也想详细说明@Adriano提出的观点。您似乎在整个代码中使用托管C ++,虽然它是专门为将C ++与CLR混合而设计的,但最好坚持使用一种方法。
System::String^ command = String::Format("B+{0:00000}", th2*100);
array<Byte>^ command_buffer = System::Text::Encoding::Unicode->GetBytes(command);
该示例使用Unicode,因为Windows操作系统使用UTF-16来表示wchar值,但是如果这是在线上预期的那样,则应将其切换为ASCII。