Modbus软件开发实战指南 之 开发自己的Modbus Poll工具 - 2
接上一篇文章的内容。
看了前面需求提到的复杂的命令行解析功能,很多人立马开始发怵,其实大可不必。
我们都知道,Linux下的程序往往都提供了复杂的命令行参数处理机制,因为这是与
其他程序或用户进行交互的主要手段,在这样的情况下难能可贵的是,为了减轻开发
人员对命令行处理的负担,Linux提供了系统函数getopt()或getopt_long()专门解析命令行参数。
在Linux系统中,函数getopt()/getopt_long()位于 unistd.h 系统头文件中,其原型分别为:
int getopt(int argc,char * const argv[],const char * optstring);
int getopt_long(int argc, char * const argv[],const char *optstring,
const struct option *longopts, int *longindex);
其中,参数argc和argv是由主函数main()传递的参数个数和内容。
参数optstring 则代表欲处理的选项字符串。此函数会返回在argv 中下一个的选项字母,
此字母会对应参数optstring 中的字母。如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,
全域变量optarg 即会指向此额外参数。如果getopt()找不到符合的参数则会打印出错信息,并将全域
变量optopt设为“?”字符,如果不希望getopt()打印出错信息,则只要将全域变量opterr设为0即可。
参数可简单划分为短参数和长参数两种类型,getopt()使用optstring所指的字串作为短参数列表,
象“1ac:d::”就是一个短参数列表。短参数的定义是一个'-'后面跟一个字母或数字,象-a, -b就是一个
短参数,每个数字或字母定义一个参数。
而长参数则形如“--debug”,前面有2个'-'符号,后面可添加多个字母或数字。
getopt_long()函数包含了getopt()函数的功能,并且还可以指定“长参数”(或者说长选项),
与getopt()函数对比,getopt_long()比getopt()多了两个参数。
此函数的基本用法如下(Linux下):
|
1 |
#include <stdio.h> int main(int argc, int *argv[]) // getopt()可由getopt_long()替换 |
以上作为参照,可见调用函数getopt()或getopt_long()可以非常方便地解析命令行。
但是,有一点遗憾的是,如此方便的函数在Windows下却没有提供,怎么办呢?当然有办法了,
既然函数getopt()/getopt_long()是GNU C中的函数,那么源码可见就可以根据情况直接移植到Windows下。
说干就干,接下来简要介绍一下移植方法,掌握一点新技能,如果对这部分没有兴趣,可以跳过,看后面的内容。
首先,访问GNU C Library (glibc)的主页http://www.gnu.org/software/libc/,并下载最新的glibc库,
当前最新版是glibc-2.24.tar.gz,下载完毕并解压。
提取加压后的目录\glibc-2.24\posix\下的4个源文件getopt.h/getopt.c/getopt_int.h/
getopt_init.c,如图所示。

图 提取getopt()相关文件
启动Visual Studio 2015,选择菜单【File】->【New】->【Project...】,
准备创建一个新的默认工程项目,项目类型为【Visual C++】→【Win32
Console Application】。
创建新的默认工程项目完毕之后,切换到资源管理器画面,将以上4个文件复制到新项目所在目录,并添加到工程项目中,如图所示。

图 添加getopt()源文件
文件添加完毕之后,我们试着编译一下看看,果不其然,文件getopt.c出现了编译错误:
getopt.c(71): fatal error
C1083: Cannot open include file: 'gettext.h':
No such file or directory
首先需要修改的是没有“gettext.h”这个头文件的问题。修改方法为直接将其注释掉或删除,然后修改后面的宏定义。
将下面的原始代码(大概在70行):
|
1 |
#ifdef _LIBC |
修改为:
|
1 |
#ifdef _LIBC |
修改完毕,继续编译一下看看,出现如下编译错误,如图所示。

图 编译错误alloca无法识别
错误的文字描述为:
getopt.c(568): warning
C4013: 'alloca' undefined; assuming
extern returning int
error LNK2019: unresolved external symbol _alloca
referenced in function __getopt_internal_r
可以发现,这里出错的原因是alloca这个函数没有定义,那么alloca函数是什么意思呢?
原来alloca是一个内存分配函数,与malloc、calloc、realloc类似,但是注意一个重要的区别,
alloca函数是在栈(stack)上申请空间,用完马上就释放。
一般情况下,函数alloca包含在头文件malloc.h中,在某些系统中被定义为内部函数_alloca的宏定义。
既然已经知道原型了,那么修改alloca为_alloca即可解决问题,如图所示。

图 修改为_alloca解决编译错误
继续添加getopt_long()/getopt_long_only()的定义,这两个函数在getopt.h文件中声明了,
但是其定义在getopt1.c中,可以直接将getopt1.c文件也拿过来用,但是因为这个文件中的内容不多,
为了减少文件的数量,直接将其中有用的部分拷贝到getopt.c文件中是个不错的主意。
文件getopt1.c中要拷贝的内容如下:
|
1 |
int int /* Like getopt_long, but '-' as well as '--' can indicate a long option. int int |
将以上代码拷贝到文件getopt.c中函数getopt()定义之后即可,修改完毕编译,一切OK!
至此函数getopt()移植结束。经过上面的修改,可以进行一些简单的测试进行验证,
测试用例不用自己写了,在文件getopt.c和getopt1.c文件中都有,直接拿过来用就可以。
至此,重新生成的4个文件:getopt.h/getopt.c/getopt_int.h/getopt_init.c就是需要的命令行解析源代码文件,可以用在Windows系统下。
至此,针对自己开发modbus poll工具的命令行解析功能基本实现了。
接下来,将进行功能部分的代码分析和调试。
Modbus软件开发实战指南 之 开发自己的Modbus Poll工具 - 2的更多相关文章
- Modbus软件开发实战指南 之 开发自己的Modbus Poll工具 - 3
Modbus-RTU 一.数据分析 两个设备(单片机)通讯,用的是Modbus协议. 在单片机中拿出一部分内存(RAM)进行两个设备通讯,例如: 说明: OX[20] 代表是 ...
- Modbus软件开发实战指南 之 开发自己的Modbus Poll工具 - 1
在开发Modbus程序的过程中,也可以发现经常需要使用诸如Modbus Poll和Modbus Slave等辅助调试工具, 用于验证MODBUS通讯消息是否正确.但是,Modbus Poll和Modb ...
- 推荐一本书:清华出版的《Modbus软件开发实战指南》
前言: 最近在研究Modbus开发,如果只是简单的了解了一些modbus基础知识,但是不够系统和全面. 其实,modbus虽然比较简单,但是如果不注意有很多坑,特别是寄存器的位数,大小端处理,浮点数, ...
- 【书籍连载】《STM32 HAL 库开发实战指南—基于F7》-第一章
从今天起,每天开始连载一章<STM32 HAL 库开发实战指南—基于F7>.欢迎各位阅读.点评.学习. 第1章 如何使用本书 1.1 本书的参考资料 本书参考资料为:<STM32 ...
- Hadoop应用开发实战(flume应用开发、搜索引擎算法、Pipes、集群、PageRank算法)
Hadoop是2013年最热门的技术之一,通过北风网robby老师<深入浅出Hadoop实战开发>.<Hadoop应用开发实战>两套课程的学习,普通Java开发人员可以在最快的 ...
- .Net RabbitMQ实战指南——客户端开发
开发中关键的Class和Interface有Channel.Connection.ConnectionFactory.Consumer等,与RabbitMQ相关的开发工作,基本上是围绕Connecti ...
- Prism开发人员指南5-WPF开发 文档翻译(纯汉语版)
2014四月 Prism以示例和文档的形式帮助你更简单的设计丰富灵活易维护的WPF程序.其中使用的设计模式体现了一些重要的设计原则,例如分离关注点和松耦合,Prism帮助你利用松耦合组件设 ...
- Prism开发人员指南5-WPF开发 Developer's Guide to Microsoft Prism Library 5.0 for WPF (英汉对照版)
April 2014 2014四月 Prism provides guidance in the form of samples and documentation that help you e ...
- JFinal极速开发实战-业务功能开发-通用表单验证器
提交表单数据时,需要经过前端的验证才能提交到后台,而后台的验证器再做一道数据的校验,成功之后才能进入action进行业务数据的处理. 在表单数据的验证中,数据类型的验证还是比较固定的.首先是对录入数据 ...
随机推荐
- HDU-1864-最大报销额
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1864 这题开始题意没搞清楚,就做题了,导致浪费了很多的时间,不应该啊, 注意事项:每张发票上,单项物品 ...
- storm遇到问题汇总
http://www.reader8.cn/jiaocheng/20131023/2139887.html 错误1:在windows下运行ExclamationTopology或者WordCountT ...
- Bootstrap入门(二十四)data属性
Bootstrap入门(二十四)data属性 你可以仅仅通过 data 属性 API 就能使用所有的 Bootstrap 插件,无需写一行 JavaScript 代码.这是 Bootstrap 中的一 ...
- 消费创富会开发模式系统App
消费创富会系统定制开发,消费创富会网页开发模式,消费创富会开发软件,消费创富会系统APP开发,消费创富会平台模式开发,专业开发微信商城分销.公排.全返.分红.互助等模式定制开发,APP.网页版.微信端 ...
- web开发的性能准则(减少页面加载时间方面)
准则(概述) 减少 HTTP 请求 使用CDN加速 避免空的src或href属性值 增加过期头 启GZIP压缩 把css文件放到头部 把javascript放到尾部 避免使用css表达式 删除不使用的 ...
- js实现省市区联动
先来看看效果图吧,嘻嘻~~~~~~~~~~~~~~~~~~~· 代码在下面: 示例一: html: <!DOCTYPE html> <html> <head> &l ...
- Oracle执行计划顺序
先从最开头一直往右看,直到看到最右边的并列的地方,对于不并列的,靠右的先执行:对于并列的,靠上的先执行. 即并列的缩进块,从上往下执行,非并列的缩进块,从下往上执行. 如下示例: Execu ...
- substring和substr、$.extend()、$.fn.extend()、(function($){….})(jQuery)的简易讲解
1. JS中substring与substr的区别 Substring: 该方法可以有一个参数也可以有两个参数. l 一个参数: 示例: var str="Olive": ...
- css3 3d初入门(一)
css3 3D.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin: 0 0 ...
- (求租仓库)navigationController .navigationBar 的属性设置
需要做成的效果如下图的