我应该如何将字节数组缓冲区传递给writefile

时间:2014-01-09 14:29:37

标签: c++ c windows-ce win32gui

我正在尝试将16byte数据写入串口,我很难将值转换为lpcvoid,这是我的代码,

  unsigned char Buffer[16];
  for (int i=0; i<16; i++)
  {
    Buffer[i]=0x20+i;

        bool bwrite=WriteFile(m_PortHandle, (LPCVOID)&Buffer[0], BufferSize, &Res, NULL);
  }

我尝试过(LPCVOID)&amp; Buffer [0]只将数组的第一个元素发送到串口,而(lpvoid)&amp; Buffer只将数组的第二个元素发送到串口。应该如何将字节数组传递给writeFile?

谢谢你, 梁

2 个答案:

答案 0 :(得分:1)

如果你想在写作之前填充缓冲区,你需要在for循环之外进行写作,如下所示:

unsigned char Buffer[16];
  for (int i=0; i<16; i++)
  {
    Buffer[i]=0x20+i;
  }
  bool bwrite=WriteFile(m_PortHandle, (LPCVOID)&Buffer[0], BufferSize, &Res, NULL);

此外,您不需要&Buffer[0] - &BufferBuffer相同,正如罗迪在下面指出的那样,它更可取,因为即使您工作也是如此用指向已分配内存的指针替换数组。

更新:我从您的评论中看到,您希望一次一个字节。要做到这一点,你真的不需要任何缓冲区,你可以这样做:(虽然我承认,我不明白为什么你不能用WriteFile一次写整个缓冲区 - 串口将无论如何一次只发送一个字节。也许WriteFile()有一个bug?)

unsigned char oneChar;
for (int i=0; i<16; i++)
{
  oneChar=0x20+i;
  WriteFile(m_PortHandle, (LPCVOID)&oneChar, 1, &Res, NULL)
}

您是否仍然需要转换为LPCVOID是在您,您的编译器和您组织的编码标准之间。 :)

答案 1 :(得分:1)

它在每个循环迭代器上发送第一个元素,因为你告诉它这样做。您需要将&Buffer[0]更改为&Buffer[i](并摆脱类型转换):

unsigned char Buffer[16];
for (int i = 0; i < 16; ++i)
{
    Buffer[i] = 0x20+i;

    bool bwrite = WriteFile(m_PortHandle, &Buffer[i], 1, &Res, NULL);
}

更新:如果要一次发送所有16个字节,而不是一次发送1个字节,则将WriteFile()移出循环,然后告诉{{1写16个字节而不是1个字节:

WriteFile()

unsigned char Buffer[16]; for (int i = 0; i < 16; ++i) { Buffer[i] = 0x20+i; } bool bwrite = WriteFile(m_PortHandle, Buffer, 16, &Res, NULL); 支持的MOST资源,无论是文件,串行端口等,都不关心是执行16个1字节写操作还是1个16字节写操作。只关注基于消息的通信资源,例如在消息模式下运行的命名管道,UDP套接字等。但是串口肯定不关心。