我正在尝试将十六进制数据写入我的串行端口。但是,尽管GetOverlappedResult返回true,但是尽管我发送了1或2或8个字节,但发送的字节数始终为0。
我能够打开/关闭端口并接收十六进制消息。我只是不知道如何将数据写入我的串行端口,以使其被另一个虚拟串行端口提取。
我引用了一个同事在网上找到的“ TimeReader”项目。我已经使用“串行端口实用程序”使用虚拟串行端口测试了端口,并设法在它们之间成功通信。在线搜索并不能帮助我完全解决问题。
我如何创建手柄:
serialPortHandle = CreateFile(("COM2"),
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING,
NULL);
我如何创建数据:
typedef struct
{
int len;
char data[1];
}Message;
(以后是我的主要功能)
message.len = 8;
message.data[0] = 0x30;
我怎么称呼WriteFile:
OVERLAPPED osWriteS = { 0 };
osWriteS.Offset = 0;
osWriteS.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
DWORD bytesSent;
_cprintf("message: %x\r\n", message.data[0]);
_cprintf("message len: %i\r\n", message.len);
if (WriteFile(serialPortHandle, message.data, message.len, &bytesSent, &osWriteS) == false)
{
_cprintf("bytes sent before overlap: %x\n", bytesSent);
if (GetLastError() != ERROR_IO_PENDING)
{
_cprintf("Failed to send message\n");
return;
}
else
{
bool _overlappedResult = GetOverlappedResult(serialPortHandle, &osWriteS, &bytesSent, TRUE);
_cprintf("overlapped: %x\n", _overlappedResult);
_cprintf("bytes: %x\n", bytesSent);
}
}
if (bytesSent != message.len)
{
_cprintf("Failed to send complete message\n");
return;
}
打印GetOverlappedResult
返回值1
,尽管消息包含bytesSent = 0
,但1 byte
仍然返回let array = [String].self -> Array<String>.Type
let element = array.Element.self -> String.Type
JSONDecoder().decode(element, from: data) -> works fine
func foo<T>(type: T.Type) where T: Decodable{
let element = type.Element -> Error. How to get element here?
JSONDecoder().decode(element, from: data)
}
foo(array)
,并且没有从其他串行端口接收到等待该值发送的数据数据。
有人可以帮助我提供有关该问题的见解吗?谢谢!