C++ 如何将字节数组缓冲区传递给writefile

C++ 如何将字节数组缓冲区传递给writefile,c++,c,windows-ce,win32gui,C++,C,Windows Ce,Win32gui,我正在尝试将16字节的数据写入串行端口,我在将值转换为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); } 无符号字符缓冲区[16]; f

我正在尝试将16字节的数据写入串行端口,我在将值转换为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);
  }
无符号字符缓冲区[16];

for(int i=0;i如果要在写入之前填充缓冲区,则需要在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);

是否仍需要转换为LPCVOID取决于您、编译器和组织的编码标准。

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


WriteFile()
支持的大多数资源,无论是文件还是串行端口等,都不关心是执行16个1字节的写入还是16个字节的写入。只有基于消息的通信资源关心,例如在消息模式下运行的命名管道、UDP套接字等,但串行端口肯定不关心。

只要
缓冲区就可以了。但是,在调用
WriteFile
之前,您可能需要将其全部填充。我需要在每次将一个字节发送到串行端口。WriteFile(m_PortHandle,Buffer,1,&Res,NULL)。它只能发送第一个元素,我想发送整个16字节,就像
Buffer
-即使
Buffer
char*
@Roddy,也可以这样做如果你的意思是数组名在没有强制转换的情况下可以工作,我同意它可以工作,但我不知道fn原型-如果指针类型不完全匹配,他可能会收到有符号/无符号警告或其他东西,具体取决于编译器标志。@Roddy-doh!我明白了-对不起,今天早上我需要更多的咖啡。是的,阵列的地址是冗余的。更新帖子。问题是我不需要一次发送所有16字节,我需要一次发送一个16字节。有什么方法可以做到吗?试过了,看看串行嗅探器,看起来只有第二个元素被发送过来了。+1但他已经说他想一次发送16个字节,一个接一个。是的,这就是上面的代码所做的-一次发送16个字节,就像他要求的那样。我以前试过,看看串行嗅探器,看起来只有第二个元素通过串行端口发送。我上面展示的代码只发送第二个元素,而没有其他元素的唯一可能方式是,如果
WriteFile()
失败,除了第二个元素之外的每个元素都会出错。否则,就会有别的事情发生。您可能没有正确索引缓冲区,或者在发送缓冲区时正在修改缓冲区,或者其他原因。再试一次,调试你的代码,看看它到底在做什么。或者你的串行嗅探器坏了。
unsigned char oneChar;
for (int i=0; i<16; i++)
{
  oneChar=0x20+i;
  WriteFile(m_PortHandle, (LPCVOID)&oneChar, 1, &Res, NULL)
}
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);
}
unsigned char Buffer[16];
for (int i = 0; i < 16; ++i)
{
    Buffer[i] = 0x20+i;
}
bool bwrite = WriteFile(m_PortHandle, Buffer, 16, &Res, NULL);