作者:in冷霜天 | 来源:互联网 | 2022-12-09 21:09
我按照这里的教程与串口通信
打开然后关闭串口的主要代码如下:
HANDLE hComm;
hComm = CreateFileA((LPCSTR)"COM8", //port name
GENERIC_READ | GENERIC_WRITE, //Read/Write
0, // No Sharing
NULL, // No Security
OPEN_EXISTING,// Open existing port only
0, // Non Overlapped I/O // FILE_FLAG_NO_BUFFERING, // copied from the MFC version
NULL); // Null for Comm Devices
if (hComm == INVALID_HANDLE_VALUE){
DWORD err = GetLastError();
printf("Error in opening serial port\n");
printf("err = 0x%x\n", err);
}
else
printf("opening serial port successful\n");
CloseHandle(hComm);//Closing the Serial Port
如果我使用CreateFile()
代码编译正常但串口未打开(我收到Error in opening serial port
消息)
在玩了一段时间的代码后,我发现CreateFileA()
成功打开了串口(我发现这个的唯一原因是因为当我搜索CreateFile()
功能时,我获得了MSDN定义页面CreateFileA()
作为第一个结果
我用Google搜索,但我找不到两者之间的区别.我找到了这个,它说我应该总是CreateFile()
和编译器应该做其余的,但它在我的情况下不起作用,只有在我专门使用时才有效CreateFileA()
是什么区别CreateFile()
和CreateFileA()
,我应该用我的计划基本串口通信是哪一个?
Windows 10
Visual Studio 2013快递
1> 小智..:
这里需要对Windows API进行一些解释:微软很早就引入了Unicode.那时,他们决定用16位代表一个Unicode字符.我想当时这是一个有效的决定.wchar_t
因此,Microsoft平台上的A 是16位宽,(Unicode)文本存储在wchar_t
s中 - 这具有每个字符具有相等宽度的优点.缺点是处理的现有API char
不再兼容.
如今,使用32位Unicode代码点,这看起来很愚蠢 - 微软平台上的Unicode文本使用UTF-16编码,因此您有两个缺点:不兼容简单char
的字符串和多字符序列.在许多其他平台上,wchar_t
32位宽,Unicode存储在这些wchar_t
s中或编码为"正常" char
的UTF-8 .
但回到Microsoft API:为了解决这个问题,他们重命名所有处理字符串的API调用都有一个A
后缀,并引入了第二组相同的调用wchar_t
,后缀W
为Unicode变体.根据编译时开关UNICODE
,原始名称将被预处理器映射到带有后缀的实名.
您可能知道,C中的字符串文字具有该类型char *
.要创建类型的字符串文字wchar_t *
,您需要在其前面添加一个L
.为了在UNICODE
设置时自动执行此操作,提供了另一个宏:_T()
.因此,您希望在代码中执行的操作是将任何字符串文字包装在内_T()
,它将L
在UNICODE
定义时准确定义前缀.
因此,这一行:
hComm = CreateFileA((LPCSTR)"COM8"
应改为:
hComm = CreateFile(_T("COM8")
一句话LPCSTR
和LPWCSTR
:它们现在等同于char *
和wchar_t *
.所以铸造是不必要的.这些名称的原因是向后兼容具有分段存储器和"远指针"的古代系统.只要您不需要为win16编译代码,就忘了它们.
最后一个个人意见:Windows已经知道Unicode很长一段时间了(IIRC已经在Win95上)并且它现在已经成为标准.您不太可能想要定位不支持unicode的Windows系统.你更想写一些可移植的代码,然后问题是对Unicode的不同处理(wchar_t
在Windows上,char
在大多数其他系统上使用UTF-8,UTF-8在互联网上也占主导地位).
为了解决这个问题,我更喜欢总是定义UNICODE
,使用wchar_t
字符串文字来表示windows API所需的任何常量字符串(就像你的CreateFile()
调用一样,只需要加上前缀L
)并char
使用UTF-8 在内部存储所有字符串,只有当你使用时才转换它们需要将它们传递给Windows API.执行转换有两个功能:MultiByteToWideChar()
和WideCharToMultiByte()
.这样,您就可以轻松地为使用UTF-8的其他操作系统的API编写适配器.