资源描述:
《上位机和单片机串口编程---API函数编程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、不用MSComm控件,那看起来只能是使用WindowsAPIT,因为MFC貌似没有什么类封装了串口API函数的。用WindowsAPI编写串口程序本身是有巨大优点的,因为控制能力会更强,效率也会更高,而且对丁•那些纯绿色软件追求者来说,没有ActiveX控件比什么都重要——呵呵,我也是这么认为。API编写串口,过程一般是这样的:1、创建串口句柄,用CreateFile;2、对串口的参数进行设置,其屮比佼重要的是波特率(BaudRate),数据宽度(BytesBits),奇偶校验(Parity),停止位(StopBits),当然,重要的还有端口号(Port);3、然后对串丨I进行相应的
2、读写操作,这时候用到ReadFile和WriteFile函数;4、读写结束后,要关闭串口句柄,用CloseFile;下面依次大致讲讲个步骤的过程:第一步,从字面上去理解,人家也可以发现CreateFile实际上表明Windows是把串口当作一个文件来处理的,所以它也有文件那样的缓冲区、旬柄、读写错课等,不同的是,这个文件名字只有固定的儿个(一般为四个),而且始终存在(EXSITTNG),而且在调用CreateFile的时候请注意它的参数。CreateFile函数原型如下:HANDLECreateFile(LPCTSTRlpFileName,DWORDdwDesiredAccess,D
3、WORDdwShareMode,LPSECURITY.ATTRIBUTESIpSecurityAttributes,DWORDdwCreationDisposition,DWORDdwFlagsAndAttributes,HANDLEhTemplateFile);lpFileName是你需要创建的端口号,默认情况卜•是C0M1;dwDesiredAccess是表明你想讣你创建的串口以何种方式存在于你的应用程序中,因为串II通常是可读可写的,所以这里必须设置为GENERIC_READ
4、GENERIC_WRITE;dwShareMode是用来设置串口共享属性的,因为串口加于临界资源,当然
5、不能共享,所以这里也必须设置为0;IpSecurityAttributes是设登安全模式,一般采川默认的安全模式就可以了,选择NULL;dwCreationDisposition是设置是否打开新的“文件"(上面说过了,Windows是把串口等端口当作文件来处理的),因为串口属于硬件端口,当然不能随便重复创建,所以这里必须告诉Windows,每次创建的时候必须使用己经存在的串口,所以这里设置OPEN_EXSITING;dwFlagsAndAttributes,这个参数可以设宜的值比较多,大家若需要深入了解可以查找MSDN,这里因为我们接下去要做的是异步通讯,所以需要设置FILE_FLA
6、G_OVERLAPPED:最后一个参数hTemplateFile是指定模板文件,串口没有模板,选择NULL;所以最后我们设遗的CreateFile两数如F:m_hCom=CreateFile(m_sPort,GENERIC_READ
7、GENERIC_WR1TE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);在创建完巾口后,最后进行句柄测试:if(m_hCom==INVALID_HANDLE_VALUE){AfxMessageBox(u打开串丨I失败!”);return;}上面说到了并步,那什么是并步呢?界步是相对同步这个概念而言的。界
8、步,就是说,在进行串口读写操作时,不用等到I/O操作完成后函数才返回,也就是说,异步可以更快得响应用户操作;同步,相反,响应的I/O操作必须完成麻函数才返回,否则阻塞线程。对于一些很简单的通讯程序来说,可以选择同步,这样可以省去很多错谋检杳,但是对于复杂一点的应用程序,异步是最佳选择;第二步,设置串口,并创建串口线程。串口有很多的属性,上血也已经介绍了一些最重要的参数。这里不得不介绍一个重量级的数据结构DCB:typedefstruct_DCB{//debDWORDDCBlength;//DCB结构体大小DWORDBaudRate;〃波特率DWORDfBinary:1;〃是否是二进制
9、,一般设置为TRUEDWORDfParity:1;//是否进行奇偶校验,我做的是ARM嵌入式,所以FALSEDWORDfOutxCtsFlow:l;//CTS线上的硬件握手DWORDfOutxDsrFlow:l;//DSR线上的硕件握手DWORDfDtrControl:2;//DTR控制DWORDfDsrSensitivity:1;DWORDfTXContinueOnXoffrl;DWORDfOutX:1;〃是否使用XON/XOFF协议DWORDflnX: