论文部分内容阅读
【摘要】 本文针对TOPCON系列通讯软件不能传输大量数据的情况,用Visual C++编写了无数量限制的通讯程序,此方法不但适用于TOPCON、NIKKOR、LECIA系列全站仪,而且适用于所有采用串行通讯的全站仪和类似设备。
【关键词】 MFC;全站仪;串口通讯
【中图分类号】:G623.58【文献标识码】:B 【文章编号】:1009-9646(2008)04-0095-01
TOPCON系列全站仪的官方通讯软件为T_Com,从其1.0到现在的最新版本1.5均存在不能传输大量数据的问题(坐标数据大于约1300条或测量数据大于约510条)。这样要传输大于这一限制的记录,只能在逐条删除其前面的记录后,才能进行,这一bug严重影响了全站仪的充分使用。而且,NIKKOR系列软件也存在这一问题,针对以上情况,再考虑到串行通讯的广泛性,以及Visual C++对通讯端口读写和数据通讯的良好封装和强大功能,选用了该方法。
1 实现原理
为了实现比较完善的数据通讯功能,需要了解以下概念:
1.1 端口配置。全站仪大多采用串行通讯,串口包括常见的COM口和USB口,串口与其它磁盘文件相对而言,其读写函数并无多大区别,实际上将读写操作转化为串口或并口的工作是由硬件驱动程序完成的。并不需要普通编程人员的控制,需要注意的只是串行通讯需要设置有关的串行通信参数,这包括波特率、数据位、校验位、停止位和数据传输延迟。
在Visuaul C++中,可以采用Windows API中的SetCommState()函数来设置串口的通讯参数,也可以采用下面的方式配置:
DCB dcb;
::GetCommState(file.m_hFile,&dcb);
dcb.BaudRate=2400;//设置波特率
dcb.ByteSize=7; //设置数据位
dcb.StopBits=1; //设置停止位
dcb.Parity=0; //设置奇偶校验
::setCommState(file.m_hFile,&dcb);
还需要设置串口的超时通讯时间:可以采用::SetCommTimeouts()函数实现(详细参数参见VC帮助)。
1.2 数据通信。端口配置好后,就可以采用套接字(在MFC中封装为CSocket类)技术进行数据通信,Windows套接字允许两个或者两个以上的应用程序相互通讯,其通讯平台可以在非Windows平台之上,这样程序就可以使用在采用不同的操作系统的全站仪上。套接字的通讯过程如下:
1.2.1 应用程序A创建一个“监听”套接字,然后使用CSocket::Listen()函数查询想与他对话的应用程序请求。
1.2.2 应用程序B创建一个套接字然后使用CSocket::Connect()试图与应用程序A连接。
1.2.3 应用程序A通过创建一个新的套接字并将它传送到CSocket::Accept(),以此在CSocket:OnAccept()中接受应用程序B的请求。
1.2.4 此后两个应用程序之间使用CSoket::Receive()和CSocket::Send()便可以进行通信。

1.3 数据处理。数据处理部分完成对接收数据的存储、编辑、转换,可以根据工作的需要以特定的格式存储,如将由全站仪采集的数据直接以文本格式记录在磁盘文件中,也可以进行数据的预处理,转换为其它软件可以直接读取的格式,如转换为逗号分隔的CSV文件,可以直接由Excel直接读取等等。
1.4 其他要点。数据传输采用报文机制,建议将报文在端口的接收和对报文的具体处理分开,这样更有利于程序编写,每传输一条记录寄送一条消息,当传输时寄送传输消息,当传输结束时寄送结束消息。在端口通讯类中实现连接的建立、解除和串口的读写,在应用程序类实现对数据的预处理和转存。
为了编写一个健壮的读写程序,建议采用多线程技术创建一个独立的线程负责数据的传输,这样可以不影响其他数据的处理,确保数据的稳定传输。
2 结语
基于以上思路,作者在VC6.0、.Net2002和.Net2005上实现了所有功能,程序运行稳定可靠,不受数量限制,完全可以替代官方軟件。采用了较多的技术元素,包括套接字类CSocket,多线程,自定义消息等技术,这些技术可以将传输的各个环节有机的组织和封装起来,便于扩展和错误检查,所以程序的健壮性较高。以上功能可以集成到所有需要与全站仪等通讯的软件中,如一体化测图软件,在传输过程中进行预处理,一次性完成数据的传输、编辑、输出工作,具有很高的实用价值。
参考文献
[1] 伍红兵编著.Visual C++ 编程深入引导[M].北京:中国水利水电出版社,2002.
[2] 张军等译.MicroSoft MFC类库大全[M],北京:清华大学出版社,1995.
[3] John E.Swanke, VC++MFC by Example[M].前导工作室译.北京:机械工业出版社,2000.
收稿日期:2008-3-29
【关键词】 MFC;全站仪;串口通讯
【中图分类号】:G623.58【文献标识码】:B 【文章编号】:1009-9646(2008)04-0095-01
TOPCON系列全站仪的官方通讯软件为T_Com,从其1.0到现在的最新版本1.5均存在不能传输大量数据的问题(坐标数据大于约1300条或测量数据大于约510条)。这样要传输大于这一限制的记录,只能在逐条删除其前面的记录后,才能进行,这一bug严重影响了全站仪的充分使用。而且,NIKKOR系列软件也存在这一问题,针对以上情况,再考虑到串行通讯的广泛性,以及Visual C++对通讯端口读写和数据通讯的良好封装和强大功能,选用了该方法。
1 实现原理
为了实现比较完善的数据通讯功能,需要了解以下概念:
1.1 端口配置。全站仪大多采用串行通讯,串口包括常见的COM口和USB口,串口与其它磁盘文件相对而言,其读写函数并无多大区别,实际上将读写操作转化为串口或并口的工作是由硬件驱动程序完成的。并不需要普通编程人员的控制,需要注意的只是串行通讯需要设置有关的串行通信参数,这包括波特率、数据位、校验位、停止位和数据传输延迟。
在Visuaul C++中,可以采用Windows API中的SetCommState()函数来设置串口的通讯参数,也可以采用下面的方式配置:
DCB dcb;
::GetCommState(file.m_hFile,&dcb);
dcb.BaudRate=2400;//设置波特率
dcb.ByteSize=7; //设置数据位
dcb.StopBits=1; //设置停止位
dcb.Parity=0; //设置奇偶校验
::setCommState(file.m_hFile,&dcb);
还需要设置串口的超时通讯时间:可以采用::SetCommTimeouts()函数实现(详细参数参见VC帮助)。
1.2 数据通信。端口配置好后,就可以采用套接字(在MFC中封装为CSocket类)技术进行数据通信,Windows套接字允许两个或者两个以上的应用程序相互通讯,其通讯平台可以在非Windows平台之上,这样程序就可以使用在采用不同的操作系统的全站仪上。套接字的通讯过程如下:
1.2.1 应用程序A创建一个“监听”套接字,然后使用CSocket::Listen()函数查询想与他对话的应用程序请求。
1.2.2 应用程序B创建一个套接字然后使用CSocket::Connect()试图与应用程序A连接。
1.2.3 应用程序A通过创建一个新的套接字并将它传送到CSocket::Accept(),以此在CSocket:OnAccept()中接受应用程序B的请求。
1.2.4 此后两个应用程序之间使用CSoket::Receive()和CSocket::Send()便可以进行通信。

1.3 数据处理。数据处理部分完成对接收数据的存储、编辑、转换,可以根据工作的需要以特定的格式存储,如将由全站仪采集的数据直接以文本格式记录在磁盘文件中,也可以进行数据的预处理,转换为其它软件可以直接读取的格式,如转换为逗号分隔的CSV文件,可以直接由Excel直接读取等等。
1.4 其他要点。数据传输采用报文机制,建议将报文在端口的接收和对报文的具体处理分开,这样更有利于程序编写,每传输一条记录寄送一条消息,当传输时寄送传输消息,当传输结束时寄送结束消息。在端口通讯类中实现连接的建立、解除和串口的读写,在应用程序类实现对数据的预处理和转存。
为了编写一个健壮的读写程序,建议采用多线程技术创建一个独立的线程负责数据的传输,这样可以不影响其他数据的处理,确保数据的稳定传输。
2 结语
基于以上思路,作者在VC6.0、.Net2002和.Net2005上实现了所有功能,程序运行稳定可靠,不受数量限制,完全可以替代官方軟件。采用了较多的技术元素,包括套接字类CSocket,多线程,自定义消息等技术,这些技术可以将传输的各个环节有机的组织和封装起来,便于扩展和错误检查,所以程序的健壮性较高。以上功能可以集成到所有需要与全站仪等通讯的软件中,如一体化测图软件,在传输过程中进行预处理,一次性完成数据的传输、编辑、输出工作,具有很高的实用价值。
参考文献
[1] 伍红兵编著.Visual C++ 编程深入引导[M].北京:中国水利水电出版社,2002.
[2] 张军等译.MicroSoft MFC类库大全[M],北京:清华大学出版社,1995.
[3] John E.Swanke, VC++MFC by Example[M].前导工作室译.北京:机械工业出版社,2000.
收稿日期:2008-3-29