我正在尝试将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?
谢谢你, 梁
答案 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]
- &Buffer
与Buffer
相同,正如罗迪在下面指出的那样,它更可取,因为即使您工作也是如此用指向已分配内存的指针替换数组。
更新:我从您的评论中看到,您希望一次写一个字节。要做到这一点,你真的不需要任何缓冲区,你可以这样做:(虽然我承认,我不明白为什么你不能用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套接字等。但是串口肯定不关心。