新工作接的第一个活,要写一个配合设备调试的上位机程序。

除了MFC界面的部分,就是要处理几条命令。

串口通信部分代码借鉴的是这一篇文章:http://blog.sina.com.cn/s/blog_afb1793101016mq2.html

https://blog.csdn.net/qq_41480046/article/details/82220155

里面代码很好理解,对于串口的连接设置,有那么几个固定的函数,之后串口的打开和读写,就是用CreateFileA、ReadFile、WriteFile这样的几个函数,将串口当做文件来操作

另外就是用了临界区来实现同步操作,

比较精妙的是串口的读线程,在循环里首先判断串口缓冲区里是否有内容,如果有再去真正读串口

我这里记录在这篇文章代码之外,自己实践之后新获得的一些心得:

1,DCB的EVEN方式的初始化写法

DCB是一个结构体,在调用SetCommState函数时作为参数传入,这是串口初始化的通用写法,不赘述

关键是初始化时的一些设置

如果设备端用了校验位,上位机这边没有用,那么设备可以连接,但收发信息是出错的

所以,初始化时候要设置校验位的使用

校验方式有以下几种:

无校验 (no parity)

奇校验 (odd parity):如果字符数据位中"1"的数目是偶数,校验位为"1",如果"1"的数目是奇数,校验位应为"0"。(校验位调整个数)

偶校验 (even parity):如果字符数据位中"1"的数目是偶数,则校验位应为"0",如果是奇数则为"1"。(校验位调整个数)

mark parity:校验位始终为1

space parity:校验位始终为0

在VS有以下宏定义对应:

#define NOPARITY 0
#define ODDPARITY 1
#define EVENPARITY 2
#define MARKPARITY 3
#define SPACEPARITY 4

问题是我一开始初始化DCB时候,传入的参数是EVENPARITY,结构出错

搞了半天,各种尝试都没用,网上也没资料,微软的官方文档也看不太懂

后来才明白使用BuildCommDCB函数构造DCB结构的时候,传入的参数应该是'E',而不是EVENPARITY,同理如果是NOPARITY的话,就传'N',其余同理

感觉很扯淡

2,判断串口是否断开的写法

那篇文章的代码里没有这样的函数,网上也找不到,但实际这样的功能非常重要!

经过实践我用下面方法解决了这个问题:

开个线程,线程里循环,每次循环Sleep一秒,线程里写: bResult = ReadFile(m_hComm, &cRecved, 0, &BytesRead, NULL);

注意第三个参数为0,表示读取长度为0,如果该参数大于1,会一直等待读数据而卡死

然后通过返回值bResult即可判断串口连接状态

经实验证明,此判断方法,不会影响其余的实际串口读写功能

3,把串口通信类封装成DLL

在公司里可能会反复遇到些串口通信的需求,如果每次都复制一遍代码重复度太高,必须封装成库,费劲一点以后就省事了

大体思路如下:

一般需求只需要设备连接、设备断开、判断设备连接状态、发送命令或数据、接收命令和数据   这五种接口

串口接收的处理肯定要写在线程里

对外接口的话,提供的是发送后接收 的 整个过程 的方法

逻辑如下:

//发送命令
........
// 等待时间5秒
int iWaitTime=; while(i--) {
//通过全局变量和接收线程通讯
//设备返回成功
if (g_iFlag == SUCCESS)
return true;
// 设备返回失败
if (g_iFlag == FAIL)
return false;
Sleep(5);
}
// 超时
return false;

这样提供的接口,

就是先发命令,然后等待设备返回结果(在线程里接收,全局变量通信),结果有三种:成功、失败、超时

以这样的思路,很容易就可以把串口通信的代码封装成dll了,这也是上面那篇文章没做到的事情

最新文章

  1. codeforces 515C. Drazil and Factorial 解题报告
  2. 如何判断一个Div是否可视区域,判断div是否可见
  3. 一个轻量级的3D CSS 库
  4. 关于DIPS的MVC 4.0项目发布与在IIS 7.0上的部署的方法
  5. Linux下,查看网络配置(IP,Gateway,DNS)
  6. 4D(DRG、DLG、DOM、DEM)数据 概念
  7. SpringMvc架构下css、js、jpg加载失败问题
  8. bzoj 2217 [Poi2011]Lollipop 乱搞 贪心
  9. Linux-基础学习(六)-Redis的进阶学习
  10. 架构师技能图谱 V1.2
  11. SSM(Spring+springMVC+MyBatis)框架-springMVC实现图片上传
  12. Java对XML文件解析方式之一_SAX
  13. Node remains in conflict,svn冲突解决办法
  14. Could not complete request
  15. GIS案例学习笔记-水文分析河网提取地理建模
  16. java删除字符串最后一个字符的几种方法
  17. 【leetcode 简单】 第一百零九题 最小移动次数使数组元素相等
  18. 【LOJ】#2037. 「SHOI2015」脑洞治疗仪
  19. kafka linux 启动脚本 sample
  20. codeforces:Prefix Sums分析和实现

热门文章

  1. Selenium-----wait的三种等待
  2. 使用 UIWebView 来播放视频
  3. BZOJ 4034 洛谷3178 树上操作题解
  4. nodeJs学习-04 POST数据请求,分段发送,分段接收
  5. C++类继承中的虚方法
  6. VSCode 设置 CPP 代码风格
  7. oracle访问Table的方式
  8. Xib设计UITableViewCell然后动态加载
  9. 给tomcat容器配置SSL的记录,包含项目完整部署过程
  10. CODE FESTIVAL 2017 qual B C 3 Steps(补题)