基于Labwindows/CVI的北斗短报文上位机设计
2019-03-19,,
,,
(中北大学 信息探测与处理技术重点实验室,太原 030051)
0 引言
目前,国外大多数采用GPS通信相对比北斗通信精度更加准确,为了能够提高北斗的大大推广与使用,北斗短报文通信在国内展开一系列的应用。北斗在国内的优势主要体现在方方面面。例如,北斗短报文通信在生活中,军用方面等起着不可替代的作用。通信抄表中,海上船员健康监测中,泥石流监测系统中。[1]根据北斗短报文的广泛应用,分析北斗短报文通信的基本性能,设计了基于Labwindows/CVI的上位机北斗短报文通信软件,软件与系统硬件的传输由Visual C++开发的串口通信调用RS232接口驱动程序完成。进行完成北斗短报文的通信,能够完成自检信息和IC地址的检测,根据用户的操作可以每间隔60秒进行一次接收与发送通信。最终通过测试顺利完成了基于Labwindows/CVI的上位机北斗短报文通信。
1 系统软件设计
1.1 总体设计
北斗短报文主要由上位机软件和北斗信通BDSC-01型数传一体机硬件部分组成。上位机软件主要采用模块化设计,首先利用主函数,串口通信等框架把上位机主要实现的功能和程序的基本实现过程进行搭建,并定义好各个模块之间的通信关系,得到以各个模块为单位的算法实现,针对各个模块进行开发,通过串口将不同的功能模块联系在一起。
上位机的软件开发在架构上有7个功能模块:参数初始化模块,串口通信模块,系统自检模块,定时接收模块,定时发送模块,清空信息模块,生成报表模块,数据显示模块。如图1所示。
图1 上位机软件模块组成结构图
参数初始化模块将串口通信的COM口清零置位操作,以便串口通信模块的顺利进行,系统自检模块通过与硬件天线相结合等待自检完成,获取天线上的IC地址。串口通信连接完成,自检结束用户可以开始进行消息的定时发送和传输,位置的获取,将接收到的消息,以及位置信息生成报表保存到Word文档中进行保存。最终各个模块的信息测试得到的数据都将显示在Labwindows/CVI界面上,在上面运行上位机界面时将看不到定时器的相关信息,会出现在界面上两个倒计时的数字,以便用户能够准确的进行信息的发送。
1.2 功能模块
上位机软件和北斗天线通过RS232串口总线进行连接,总线串口软件使用编写的串口通信函数动态库与RS232通信,并进行波特率,数据位,校验位,停止位的配置[2]。配置完成打开串口,进行系统自检,判断是否进行进行到系统自检,当判断是否进行自检时,进行了一步步判断依次进行当上位机首先检测到不是系统自检时,进行下一步判断是否进行通信申请当进行通信申请正常时,依次进行下一步的自检信息,当自检信息依次上面流程完成时,便可进入正常的信息的发送与接收。获取北斗天线的IC地址值,地址值获取完成即可进行地址的获取以及信息的发送与接收,不管发送数据还是进行接收数据都是识别人机界面发生的事件,从而响应用户的操作,进行各种指令的后台准备,可以对每次发送消息的字符限制进行测试。并将获取来的地址进行加以分析。北斗短报文的上位机可以为消息的获取,以及地理位置的准确定位,同时进行时间上的间隔以免消息发生漏传,漏发[3]。经过总体的把握和具体实际开发,最后形成的人机交互界面如图2所示。
图2是上位机主界面,在进行上位机的自检之前,应当先进行串口通信,确保在通信之前所有的串口进行初始化配置。
1.3 硬件组成部分
北斗短报文的硬件部分基于BDSC-01型数传一体机,针对北斗电力抄表、水利雨量监测、海洋浮标数据传输设计的一款支持北斗RDSS、RNSS以及GPS的多功能北斗通信终端。可实现RDSS的双向定位、短报文通信、位置报告以及RNSS的定位和授时功能。终端采用一体化设计,固定杆安装更为方便,配备串口,便于用户进行二次开发。终端体积小、功耗低,连接简单、操作方便,可广泛应用于电力、水利、海洋等行业。
全天候的双向短报文通信和导航定位功能;支持BDS/GPS双模工作,保证导航定位更加稳定;集成化程度高,RDSS模块、RNSS模块及天线融于一体;采用防水设计IP67,可在室外可靠工作。相对于北斗短报文的通信模块用户通过发送通信指令,实现短报文通信功能;短报文通信需要对卫星发射信号并占用服务频度;短报文最大字节数由用户卡所决定;单次发送的电文字节数不能超过用户卡所规定的字节数,否则多余的字节数将会被丢弃。采用插卡模式用户机要正常使用,必须插入北斗专用的SIM卡。
SIM卡主要参数,卡号:用户卡的唯一识别号码;入站频度:用户机在两次发送的最小时间间隔,单位秒;最大发送电文BIT数:用户机能够一次发送的最大信息 BIT数。北斗 双向定位 用户通过发送定位指令,实现双向定位功能;双向定位需要对卫星发射信号并占用服务频度; 卫星收到请求指令后,会反馈给用户机当前所在位置的经度、纬度和高程;这部分主要是作为北斗短报文上位机的辅助部分,作为参考使用。
北斗短报文的硬件使用时应该注意用户机底座装有安装支架,可以用喉箍将装好安装支架的用户机牢牢地绑定到固定物上;请确保用户机圆形天线端朝上,并安装牢固; 确认是否有东西会遮挡用户机,如果用户机被遮挡请及时清理,否则将使用户机性能变差或失效。用户机未连接电缆时,必须给电源接口装上密封套。如图3所示。
图2 上位机主界面 图3 北斗短报文硬件组成
2 软件设计中的关键技术
2.1 串口通信技术
基于Labwindows/CVI的串口通信在基于北斗短报文的通信平台中提供了极大方便。在上图2中打开串口,进行串口初始化,设置串口通信。包括端口参数串口号,波特率,数据位,停止位,奇偶校验位等参数设置。[4-5]在Labwindows/CVI中的RS232函数库中提供了串口通信的控制函数:打开和关闭函数;串口的读写函数;串口设置函数以及回调函数。其中部分被用到打开关闭函数如下:OpenCom(打开串口),OpenComConfig(打开串口同时设置通讯参数),CloseCom(关闭串口);串口的读写函数如下:ComRd(从串口读一个字符串),ComWrt(从串口写一个字符串);串口设置函数如下:SetCTSMode(设置硬件握手),FlushInQ(清空接收队列)[6-7],FlushOutQ(清空接收队列);SetXMode(允许或禁止串口通信的软件握手)。
使用基于Labwindows/CVI开发环境串口通信程序不仅仅降低了开发效率,同时大大缩短了测试时间,提高了可靠性并且具有很高的通用性。相对于其它上位机软件的编写而言再该程序软件中主要图形界面应用简单大方得体,使得开发者很容易进行程序的上手,便于参考着的使用。良好的用户界面(GUI)强大库函数和便捷的调试手段,能够更好更优的开发。部分串口通信代码如下:
GetCtrlVal(panelHandle,PANEL_COM_B, &portNumber); //串口号
if(portNumber>0)
{
GetCtrlVal(panelHandle, PANEL_OPEN_COM_B, &getFlag);
if(getFlag == 1)
{
GetCtrlVal(panelHandle, PANEL_BAUDRATE_B, &baudRate) //波特率
GetCtrlVal(panelHandle, PANEL_PARITY_B, &parity); //校验位
GetCtrlVal(panelHandle, PANEL_DATABITS_B, &dataBits); //数据位
GetCtrlVal(panelHandle,PANEL_STOPBITS_B, &stopBits); //停止位
sprintf(deviceName,"COM%d",portNumber)
COM_B = portNumber;
ret=OpenComConfig(portNumber,deviceName, baudRate, parity, dataBits, stopBits, 512, 512);
if(ret < 0) MessagePopup("RS232错误","配置串口B失败!");
SetComTime (portNumber, 5);
InitCOM_B(1);
SetCtrlAttribute(panelHandle, PANEL_SELFTEST_B, ATTR_DIMMED, 0);
}
else if(getFlag == 0)
{
SetCtrlVal(panelHandle, PANEL_XTZJ_LED_B, 0);
Sleep(500);
CloseCom (portNumber);
InitCOM_B(0);
SetCtrlAttribute(panelHandle,PANEL_SELFTEST_B, ATTR_DIMMED, 1);
SetCtrlAttribute(panelHandle, PANEL_SEND_B, ATTR_DIMMED, 1);
}
}
2.2 北斗协议分析
通过串口精灵监视得到的数据根据北斗通信协议加以分析。打开串口后进行上位机的XTZJ(系统自检),ICJC(IC检测),TXSQ(通信申请),ZJXX(自检信息)依次进行完之后获取得到自检成功同时获得IC地址,监视数据如图4。
图4 串口监视数据
根据串口精灵监视得到的数据,对应北斗协义2.0分析得出IC检测:24 49 43 58 58 00 16 04 81 1C 00 1D 81 DD 06 00 3C 03 00 00 00 D9其中24 49 43 58 58 代表IC检测,中间部分代表帧号,04 81 1C代表用户机的IC地址295196,04 B3 E1代表320433,两个用户机分别是在该实验中进行试验得到的数据,00 D9代表校验位发送中北大学回显与北斗一号的用户级数据接口协议相符显示十六进制如下:24 46 4B 58 58 00 10 04 81 1C 04 00 00 00 3C 98。进行多次试验进行一次发送汉字,英文字母,数字等按照北斗通信协议一一对应多次进行研究查阅相应的编码表得出相应的编码规范能够应用于广泛的通信中,得到对应十六进制的解析。其中在通信中涉及到了一些进制的转化,比如ASCII与十六进制的转化进行相关计算最终得出相应的准确信息。如下表1,表2依次表示用户机接口协义。
表1 用户机,信息检测接口协议
表2 用户机协议
在实验中点击自检,等待自检完成时获取IC地址分别获取两个用户机的的地址分别为295196和320433如图5~6所示。
图5 用户机IC地址获取 图6 用户机IC地址获取
2.3 多线程技术
上位机软件在设置定时的过程中涉及多线程以及线程池问题,当接收信息和发送信息时遇到多任务的处理情况,比如在进行客户端A向客户端B发送消息时,同时客户端B向客户端A发送数据时可以并行进行。若采用单线程变成方法,需要等待一方数据传输完时才能进行另一方的信息传输,大大的降低了程序的执行效率,系统的实时性也难以得到保证。[8]而多线程程序是在同一段时间内进行至少有两个独自的线程在执行代码,其中每一个线程都有自己的堆栈情况进行独自的分配,并且能够进行独立的运行在其他程序的线程中,即能进行各种保证线程运行的实时性,又能够响应客户的其它操作,能够在最大限度上地提高系统的运行速度以及程序的响应速度。[9]
北斗短报文上位机设计主要在定时中涉及到了多线程池问题,应用于客户端操作的CmtThreadPoolHandle poolHandle线程池操作,具有最高的优先级,保证了客户端A和客户端B在同时进行消息发送时及时的响应处理。这样就不用担心信息在传输过程中的丢失。
在Labwindows/CVI给用户提供了两种线程机制:线程池和异步定时器。线程池就像一个线程容器,里面放的就是运行中的线程数据起着保存数据分析数据的作用,采用函数CmtScheeduleThreadPoolFunction启动一个新线程,定时线程在线程池中开辟。异步定时器是一种在程序中适时生成的定时器,在一定时间内反复执行代码实现功能,生成异步定时器的函数可以是NewAsyncTimer,在函数中配置其间隔时间,事件发生次数以及事件的响应函数,信息显示线程通过异步定时器实现。[10]使用多线程机制后,信息的读取无丢失,处理以及分析的时间充足,大大提高了程序的执行能力。
2.4 Labwindows/CVI的定时技术
上位机软件中进行定时接收和定时发送中,使用到定时器间隔一定的时间间隔来触发事件。由定时器控制这些事件进行的速度,用户只能在界面上看到该控件,但是在程序的运行过程中是不可见的。正是因为如此,在上位机程序的运行过程中,用过操作时不能使用鼠标或是键盘去进行操控。定时器会按照用户设定好的时间间隔,产生EVENT_TIMER_TICK事件,随后会执行相应的回调函数。其中里面涉及到定时器的两个重要属性分别为:ATTR_ENABLED为定时器是否可以进行相应控件的回调函数;ATTR_INTERVAL为设置定时器执行回调函数的时间间隔。[11-12]]其中部分代码如下:
CopyBytes (len, 0, RecvBuf_B, 4, 2);
ComRd(COM_B,RecvBuf_B,HexConvertDecimal(len,2)-7);
CopyBytes(temp,7,RecvBuf_B,0,HexConvertDecimal(len,2)-7);
if(CheckSum(temp,HexConvertDecimal(len,2)-1) != temp[HexConvertDecimal(len,2)-1])
{
TimerRecvB = WAIT_RECV_B;
return 0;
}
CopyBytes (ADD_B, 0, RecvBuf_B, 0, 3);
sprintf(addStr,"%ld",HexConvertDecimal(ADD_B,3));
SetCtrlVal(panelHandle, PANEL_IC_ADD_B, addStr);
SetCtrlAttribute(panelHandle,PANEL_SEND_B, ATTR_DIMMED, 0);
TimerRecvB = WAIT_RECV_B;
break;
case 0x0d: //FKXX
//InsertTextBoxLine(panelHandle, PANEL_RECEIVEBOX_B, -1, "FKXX");
break;
case 0x0c: //TXXX
CopyBytes (len, 0, RecvBuf_B, 4, 2);
ComRd(COM_B,RecvBuf_B,HexConvertDecimal(len,2)-7);
CopyBytes (temp, 7, RecvBuf_B, 0, HexConvertDecimal(len,2)-7);
if(CheckSum(temp,HexConvertDecimal(len,2)-1) != temp[HexConvertDecimal(len,2)-1])
{//TimerRecvB = WAIT_RECV_B;
return 0;
CopyBytes (len, 0, RecvBuf_B, 9, 2);
CopyBytes (temp, 0, RecvBuf_B, 12, HexConvertDecimal(len,2));
sprintf(disStr,"%s",temp);
InsertTextBoxLine(panelHandle,PANEL_RECEIVEBOX_B, -1, disStr);
TimerRecvB = WAIT_RECV_B;
break;
}
}
3 测试结果与分析
打开软件客户端A串口与客户端B串口,根据电脑系统检测到的串口选择好串口号,波特率,校验位,数据位以及停止位,初始准备工作已完成,进行系统自检指示框变成绿色表示已经自检成功,点击系统自检获取IC地址如图所示的客户端A与客户端B的地址,此时表明可以进行正常客户端A与客户端B的通信,每隔60秒定时由客户端A向客户端B发送数据成功显示在客户端B上,同时也测试客户端B向客户端A发送数据客户端A成功显示,如下图7所示。
图7 实验测试结果
4 结论
通过介绍北斗短报文通信的上位机软件设计与实现。设计主要采用以模块化为思路,贯穿整个上位机的设计过程,将系统的所有功能按照模块加以划分,使得程序的结构清晰明了,便于测试,大大的提高了编程效率,增强了软件的可维护性与可扩展性。软件开发过程中使用线程池技术以及定时器技术,得以使信息正确地进行传输;根据北斗通信协议的正确解析与分析使得通信的正常运行;串口通信技术,实现了软件与硬件的连接,顺利完成了多次测试任务,性能稳定,界面简单大方,操作简单,坚实的消息的正常传输更简单化,智能化。