英创信息技术GPRS-串口数据透明传输简介

gprs通讯和串口通讯都是工控领域使用极为频繁的数据传输方式,而实际工程中经常需要在gprs和串口之间进行数据的透明传输,即:将串口终端设备传输过来的各种数据通过gprs发送到另一设备,或者将gprs终端设备传输过来的数据通过串口转发。利用英利开发资料光盘中的gprs、以太网和串口示例程序,可以很容易地开发这样一个gprs-串口数据透明传输的应用例程。
在英利开发资料光盘的“应用开发软件”-“典型应用”中,有一个名为“gprs232”的文件夹,就是gprs-串口数据透明传输的示例工程文件。该例程包括了串口、以太网和gprs操作,以多线程方式实现,程序流程如下:
1、初始化串口并启动串口数据处理线程
2、打开gprs并建立连接
3、建立tcp连接,启动网络数据处理线程并进行数据透明传输
1、准备工作
在测试和使用该例程之前,需进行如下准备工作:
1、将英利工控主板的调试串口连接到开发主机,然后将英利工控主板的串口ttys2(程序默认。如果使用其他串口,请参照程序代码,在命令行带入相关参数)与实验用pc机的串口连接(开发主机的com1往往和英利工控主板的调试串口连接,用于通过超级终端操作英利工控主板。因此如果开发主机还有一个完好的串口,可以将此串口连接到ttys2;否则建议客户另找一台pc机连接ttys2,以便于测试该例程。本文中的“实验用pc机”就是指连接ttys2的pc机)。
2、将实验用pc机、开发主机和英利工控主板都接入实验室内网,并确保实验室内网和公共局域网的连接都正确无误。
3、将eta300与英利工控主板连接好,将实验用sim卡装在eta300上面。
4、将英利工控主板/mnt/nandflash文件夹下userinfo.txt文件中的默认网关改为0,即如下:
defaultgateway='0'
如果不进行这个修改,则系统默认会通过以太网,而非gprs传输数据。
5、通过实验室的网关路由器,为实验用pc机分配一个端口,并记下该网关路由器的外网ip地址。
6、将英利开发资料光盘“工具软件”中的“串口调试助手”和文件夹“tcptest_linux”复制到实验用pc机上,启动串口调试助手和“tcptest_linux”中的tcptest。tcptest启动以后将套接字类型选择为服务器,服务器名称填入实验用pc机的内网ip地址,服务器端口填入之前为实验用pc机分配的端口号,然后选择侦听,如下图所示。
2、例程测试
以上6步准备完毕以后,在开发主机上启动超级终端,为英利工控主板上电,启动sourcery g++并编译gprs232工程文件,通过超级终端将应用程序下载到英利工控主板的/mnt/nandflash文件夹中,并输入如下命令运行程序:
[root@em9x60 /mnt/nandflash]#./gprs232 50
由于gprs模块首次上电连接速度可能比较慢,因此此处设置了参数50(等待50秒。该项设置与用户使用的sim卡有关。如果50秒以后仍然无法连接,可以将这个时间再加长)。一旦首次连接成功以后,只要不断开电源,再次运行该程序的时候可以不设置这个参数,直接如下运行即可:
[root@em9x60 /mnt/nandflash]#./gprs232
此后系统自动进行初始化和连接,过程中用户可以看到eta300上的sync灯闪动,表示找到sim卡以及连网,同时超级终端会显示相应的运行信息。连接成功以后,超级终端最后一行信息显示:tcp connect success;同时,实验用pc机上tcp test的消息栏也从不可编辑的灰色状态变为可以输入信息状态,如下图所示。
此后通过串口调试助手发送信息,可以看到信息显示在tcp test的“接收的信息”栏中,通过tcp test发送的信息则显示在串口调试助手的接收区中。发送/接收数据的过程中,eta300的sync灯会闪动,表示数据正通过gprs发送/接收。如果sync灯没有闪动,则数据并不是通过gprs发送/接收。此时需检查userinfo.txt的默认网关是否配置为0。
3、程序说明
该例程的主程序参见光盘中的源文件。本例程以多线程方式实现,串口、tcp数据收发由各自独立的线程完成,这样不但能够充分发挥嵌入式linux多任务操作系统的优势、实时处理数据,同时有利于减少系统开销、提高系统资源利用效率。其中主程序部分需要用户自行填写参数的是以下两个地方:
// 此处填写网关路由器的外网ip地址
strcpy( serverip, '222.212.15.128' );
// 此处填写通过实验室的网关路由器为实验用pc机分配的端口号
tcpclntmanager.addtcpclientobject( serverip, 7051 );
数据处理分别在串口数据处理线程receivethreadfunc和tcp数据处理线程socketthreadfunc中进行。
串口部分:
// 声明外部变量tcpclntmanager类
extern class ctcpclientmanager tcpclntmanager;
int cserial::receivethreadfunc(void* lparam)
{
// 得到cserial实例指针
cserial *pser = (cserial*)lparam;
.
.
.
if (ret > 0)
{
// 判断是否读事件
if (fd_isset(pser->m_fd,&fdread))
{
// data available, so get it!
pser->m_datlen = read( pser->m_fd, pser->datbuf, 100 );
// 接收串口数据处理函数
if( pser->m_datlen > 0 )
{
pser->packagepro( pser->datbuf, pser->m_datlen );
}
// 处理完毕
}
}
}
// 接收串口数据处理函数
int cserial::packagepro( char* buf, int len )
{
// 将接收的数据发送至tcp服务器
ctcpclient* ptcpclnt;
buf[len] = 0;
// 检测tcp连接是否打开
if( tcpclntmanager.m_tcpclientinfo[0].connstate == csopen )
{
ptcpclnt = (ctcpclient*)tcpclntmanager.m_tcpclientinfo[0].ptcpclient;
// 调用ctcpclient类的发送函数将串口接收到的数据发送到tcp服务器
ptcpclnt->senddata( buf, len );
}
return 1;
}
tcp部分:
// 声明外部变量cserial类
extern class cserial m_serial;
// tcp数据处理线程
int ctcpclient::socketthreadfunc( void* lparam )
{
ctcpclient *psocket;
// 得到ctcpclient实例指针
psocket = (ctcpclient*)lparam;
.
.
.
if (ret > 0)
{
.
.
.
else
{
// 对接收的数据进行处理
psocket->recvbuf[psocket->m_nrecvlen] = 0;
// printf( 'rcv:%s\n', psocket->recvbuf);
// 调用cserial类的发送函数将gprs接收到的数据发送到串口调试助手
m_serial.writeport( psocket->recvbuf, psocket->m_nrecvlen );
// psocket->senddata( psocket->recvbuf, psocket->m_nrecvlen );
// 处理完毕
}
}
}

基于MSP430的无线传感器节点动态功率管理研究
上海芯片制造公司排名
具有保护功能的延时渐亮灯
AM021047SF-3H宽带功率放大器AMCOM
开创真无线蓝牙耳机新起点 索尼真无线降噪蓝牙耳机WF-1000XM3
英创信息技术GPRS-串口数据透明传输简介
Galaxy A52和Galaxy A72将在印度推出
玄铁RISC-V处理器8款芯片实战分析
三星 SDI、LG 新能源、SKI 等动力电池 “韩国帮”,正在超高镍电池技术路线上急行军
光模块参数
面向初学者的11个最佳树莓派项目介绍
芯片等离子活化原理 提高化学惰性、抗腐蚀性、耐磨性
TD-LTE试验进入拐点 三企业推多模芯片
我国充电桩市场步入2.0时代,技术路线百花齐放互联互通加速推进
Agilent E4431B ESG-D系列 信号发生器
太赫兹波介于微波波段的终点与红外线波段的起点之间
常用的linux系统性能监控命令
倍捷连接器携多款互联解决方案登陆台湾国际智慧能源周
10本让你成为机器学习领域的专家的好书!
时科电子颜小东:《让LED产品拥有良芯》的的主题演讲