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

除了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了,这也是上面那篇文章没做到的事情

C\C++串口通信编程的一点技术记录的更多相关文章

  1. QT串口通信编程

    QT串口编程 文件夹目录结构如下图所示 设计的示例界面如下图所示 首先在项目文件里面添加一句 QT += serialport SerialPortDemo.pro文件如下: #----------- ...

  2. stm32串口通信实验,一点笔记

    第一次深入学习stm32,花了好长时间才看懂代码(主要是C语言学习不够深入),又花了段时间自己敲了一遍,然后比对教程,了解了利用中断来串口通信的设置方法. 板子是探索版f407,本实验工程把正点原子库 ...

  3. linux 串口通信 编程详解

    计算机串口的引脚说明 序号 信号名称 符号 流向 功能 3 发送数据 TXD DTE→DCE DTE发送串行数据 2 接收数据 RXD DTE←DCE DTE 接收串行数据 7 请求发送 RTS DT ...

  4. 串口通信编程向导 Serial Programming Guide for POSIX Operating Systems

    https://www.cmrr.umn.edu/~strupp/serial.html#CONTENTS Introduction Chapter 1, Basics of Serial Commu ...

  5. Linux与Windows串口通信

    串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛.现在国际上不断有串口新技术及新规格推出,结合社会各方面需要,串口通信发展的空间庞大.串口通讯技术因其自身的优势和 ...

  6. STM32F407 串口通信实验 视频第27节 个人笔记

    前言 第26节也是串口,笔记链接在此:https://www.cnblogs.com/YuQiao0303/p/10019362.html github地址:https://github.com/Yu ...

  7. STM32F407 串口通信实验 第26节 个人笔记

    前言 这篇笔记对应正点原子STM32F407探索者 ,教学视频第26节,网址如下: https://ke.qq.com/webcourse/index.html#cid=279403&term ...

  8. C#初入串口通信(串行通信)总结

    使用WinFrom来实现: 首先要知道串口通信协议以及原理 原理大概提一下:要自己翻阅看.(http://book.51cto.com/art/200911/162532.htm或者http://hi ...

  9. 电赛菜鸟营培训(三)——STM32F103CB之串口通信

    一.串口通信概念 1.缩写 USART:Universal Synchronous/Asynchronous Receiver/Transmitter 通用同步/异步接收和发送器 2.用处 (1)同步 ...

随机推荐

  1. NS2学习笔记

    这两天在调一个仿真程序,比较奇怪的错误,就是一个节点广播消息,在它通信半径内的节点收不到消息,一直在通信上找问题,找了半天也没找到. 最后,用gdb调试,发现在一个操作指针处发生了段错误,引起的原因时 ...

  2. 在IDEA中实战Git 合并&提交&切换&创建分支

    工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 场景三:小 ...

  3. SED总结, mac上要加备份文件名,sort命令和对中文的处理

    使用sed批量改文件名 Sed批量去拓展名 |- dev.gb.conll06.raw |- test.gb.conll06.raw |- train.gb.conll06.raw 想要去掉其中的后缀 ...

  4. Vue知识点——vue数据深拷贝方法

    背景 在vue页面传递数据的过程中,传递数据的引用地址并不会改变,所以当我们改变一些数据时,数据源 也会随之改变.可是有很多情景,我们改变传递的数据,并不需要源数据值发生变化,这时我们就需要对数据进行 ...

  5. oracle函数 ROW_NUMBER()

    [语法]ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) [功能]表示根据COL1分组,在分组内部根据 COL2排序,而这个值就表示每组内部排序后 ...

  6. IoT SaaS加速器——助力阿尔茨海默病人护理

    场景介绍 阿尔茨海默病,是导致中老年人认知功能障碍的最常见疾病之一,是发生在老年期及老年前期的一种原发性退行性脑病.据估计,全世界痴呆症患者数量为4700万,到2030年将达到7500万人.痴呆症患者 ...

  7. 《C语言深度解剖》学习笔记之函数

    第6章 函数 1.编码风格 [规则6-1]每一个函数都必须有注释 [规则6-2]每个函数定义之后以及每个文件结束之后都要加若干个空行 [规则6-3]在一个函数体内,变量定义与函数语句之间要加空行 [规 ...

  8. hdu 4128 Running relay (线性规划转半平面交)

    Problem - 4128 对偶线性规划转半平面交,这题的正解O(nlogn)解法,目前网上没有找到这样的正解. 原来的不等式组, sigma{-si*xi}>=-W+d*sigma{si} ...

  9. @codeforces - 1205E@ Expected Value Again

    目录 @description@ @solution@ @part - 1@ @part - 2@ @part - 3@ @solution@ @details@ @description@ 给定两个 ...

  10. 学习meta标签http-equiv属性

    meta标签http-equiv属性的使用:meta标签http-equiv属性的使用