use*_*267 3 c serial-port visual-studio
我按照这里的教程与串口通信
打开然后关闭串口的主要代码如下:
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
Run Code Online (Sandbox Code Playgroud)
如果我使用CreateFile()代码编译正常但串口未打开(我收到Error in opening serial port消息)
在玩了一段时间的代码后,我发现CreateFileA()成功打开了串口(我发现这个的唯一原因是因为当我搜索CreateFile()功能时,我获得了MSDN定义页面CreateFileA()作为第一个结果
我用Google搜索,但我找不到两者之间的区别.我找到了这个,它说我应该总是CreateFile()和编译器应该做其余的,但它在我的情况下不起作用,只有在我专门使用时才有效CreateFileA()
是什么区别CreateFile()和CreateFileA(),我应该用我的计划基本串口通信是哪一个?
Windows 10
Visual Studio 2013快递
小智 10
这里需要对Windows API进行一些解释:微软很早就引入了Unicode.那时,他们决定用16位代表一个Unicode字符.我想当时这是一个有效的决定.wchar_t因此,Microsoft平台上的A 是16位宽,(Unicode)文本存储在wchar_ts中 - 这具有每个字符具有相等宽度的优点.缺点是处理的现有API char不再兼容.
如今,使用32位Unicode代码点,这看起来很愚蠢 - 微软平台上的Unicode文本使用UTF-16编码,因此您有两个缺点:不兼容简单char的字符串和多字符序列.在许多其他平台上,wchar_t32位宽,Unicode存储在这些wchar_ts中或编码为"正常" 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"
Run Code Online (Sandbox Code Playgroud)
应改为:
hComm = CreateFile(_T("COM8")
Run Code Online (Sandbox Code Playgroud)
一句话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编写适配器.