有两种方式可以操作串口:同步操作方式和异步操作方式(即重叠操作方式)。同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而异步操作方式,API函数会立即返回,操作在后台进行,避免进程阻塞。异步操作方式还允许读、写操作能同时进行(即重叠操作),在实际科研项目中非常有用。但是无论哪种操作方式,一般都通过下面的四个步骤来完成:
1.打开串口;
2.配置串口
3.读写串口
4.关闭串口
1. 打开串口
在很多系统中(包括Windows系统)把文件的概念进行了拓展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile()来打开或创建的。该函数的原型是:同步I/O方式打开串口的示例代码如下:<span style="font-size:18px;">HANDLE CreateFile( LPCTSTR lpFileName, //将要打开的串口逻辑名 DWORD dwDesiredAccess, //指定串口访问的类型 DWORD dwShareMode, //指定共享属性 LPSECURITY_ATTRIBUTES lpSecurityAttributes, //引用安全型属性结构 DWORD dwCreationDistribution, //创建标志 DWORD dwFlagsAndAttributes, //属性描述 HANDLE hTemplateFile //对串口而言该参数必须置为NULL );</span>
与同步I/O方式打开的过程与步骤相同,只是参数有点变化,异步I/O打开串口的代码示例如下:<span style="font-size:18px;">HANDLE OpenCom() { HANDLE hCom; <span style="font-family: Arial, Helvetica, sans-serif;">//串口句柄</span> hCom = CreateFile("COM1", //打开COM1串口 GENERIC_READ|GENERIC_WRITE, //允许串口读写 0, //独占方式,即串行 NULL, OPEN_EXISTING, //打开已存在的文件 0, //同步方式打开 NULL); if(hCom == (HANDLE)-1) //打开失败 { AfxMessageBox("打开串口失败!"); return NULL; } return hCom; }</span>
<span style="font-size:18px;">HANDLE OpenCom() { HANDLE hCom; hCom = CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, //打开已经存在的文件 FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //重叠方式 NULL); if(hCom == (HANDLE)-1) { AfxMessageBox("打开串口失败!"); return NULL; } return hCom; }</span>