GPRS通訊和串口通訊都是工控領域使用極為頻繁的數(shù)據(jù)傳輸方式,而實際工程中經(jīng)常需要在GPRS和串口之間進行數(shù)據(jù)的透明傳輸,即:將串口終端設備傳輸過來的各種數(shù)據(jù)通過GPRS發(fā)送到另一設備,或者將GPRS終端設備傳輸過來的數(shù)據(jù)通過串口轉發(fā)。利用英利開發(fā)資料光盤中的GPRS、以太網(wǎng)和串口示例程序,可以很容易地開發(fā)這樣一個GPRS-串口數(shù)據(jù)透明傳輸?shù)膽美獭?/p>
在英利開發(fā)資料光盤的“應用開發(fā)軟件”-“典型應用”中,有一個名為“gprs232”的文件夾,就是GPRS-串口數(shù)據(jù)透明傳輸?shù)氖纠こ涛募T摾贪舜凇⒁蕴W(wǎng)和GPRS操作,以多線程方式實現(xiàn),程序流程如下:
1、初始化串口并啟動串口數(shù)據(jù)處理線程
2、打開GPRS并建立連接
3、建立TCP連接,啟動網(wǎng)絡數(shù)據(jù)處理線程并進行數(shù)據(jù)透明傳輸
1、準備工作
在測試和使用該例程之前,需進行如下準備工作:
1、將英利工控主板的調(diào)試串口連接到開發(fā)主機,然后將英利工控主板的串口ttyS2(程序默認。如果使用其他串口,請參照程序代碼,在命令行帶入相關參數(shù))與實驗用PC機的串口連接(開發(fā)主機的COM1往往和英利工控主板的調(diào)試串口連接,用于通過超級終端操作英利工控主板。因此如果開發(fā)主機還有一個完好的串口,可以將此串口連接到ttyS2;否則建議客戶另找一臺PC機連接ttyS2,以便于測試該例程。本文中的“實驗用PC機”就是指連接ttyS2的PC機)。
2、將實驗用PC機、開發(fā)主機和英利工控主板都接入實驗室內(nèi)網(wǎng),并確保實驗室內(nèi)網(wǎng)和公共局域網(wǎng)的連接都正確無誤。
3、將ETA300與英利工控主板連接好,將實驗用SIM卡裝在ETA300上面。
4、將英利工控主板/mnt/nandflash文件夾下userinfo.txt文件中的默認網(wǎng)關改為0,即如下:
DefaultGateway='0'
如果不進行這個修改,則系統(tǒng)默認會通過以太網(wǎng),而非GPRS傳輸數(shù)據(jù)。
5、通過實驗室的網(wǎng)關路由器,為實驗用PC機分配一個端口,并記下該網(wǎng)關路由器的外網(wǎng)IP地址。
6、將英利開發(fā)資料光盤“工具軟件”中的“串口調(diào)試助手”和文件夾“TCPTest_Linux”復制到實驗用PC機上,啟動串口調(diào)試助手和“TCPTest_Linux”中的TCPTest。TCPTest啟動以后將套接字類型選擇為服務器,服務器名稱填入實驗用PC機的內(nèi)網(wǎng)IP地址,服務器端口填入之前為實驗用PC機分配的端口號,然后選擇偵聽,如下圖所示。
2、例程測試
以上6步準備完畢以后,在開發(fā)主機上啟動超級終端,為英利工控主板上電,啟動sourcery g++并編譯gprs232工程文件,通過超級終端將應用程序下載到英利工控主板的/mnt/nandflash文件夾中,并輸入如下命令運行程序:
[root@EM9X60 /mnt/nandflash]#./gprs232 50
由于GPRS模塊首次上電連接速度可能比較慢,因此此處設置了參數(shù)50(等待50秒。該項設置與用戶使用的SIM卡有關。如果50秒以后仍然無法連接,可以將這個時間再加長)。一旦首次連接成功以后,只要不斷開電源,再次運行該程序的時候可以不設置這個參數(shù),直接如下運行即可:
[root@EM9X60 /mnt/nandflash]#./gprs232
此后系統(tǒng)自動進行初始化和連接,過程中用戶可以看到ETA300上的SYNC燈閃動,表示找到SIM卡以及連網(wǎng),同時超級終端會顯示相應的運行信息。連接成功以后,超級終端最后一行信息顯示:TCP Connect Success;同時,實驗用PC機上TCP Test的消息欄也從不可編輯的灰色狀態(tài)變?yōu)榭梢暂斎胄畔顟B(tài),如下圖所示。
此后通過串口調(diào)試助手發(fā)送信息,可以看到信息顯示在TCP Test的“接收的信息”欄中,通過TCP Test發(fā)送的信息則顯示在串口調(diào)試助手的接收區(qū)中。發(fā)送/接收數(shù)據(jù)的過程中,ETA300的SYNC燈會閃動,表示數(shù)據(jù)正通過GPRS發(fā)送/接收。如果SYNC燈沒有閃動,則數(shù)據(jù)并不是通過GPRS發(fā)送/接收。此時需檢查userinfo.txt的默認網(wǎng)關是否配置為0。
3、程序說明
該例程的主程序參見光盤中的源文件。本例程以多線程方式實現(xiàn),串口、TCP數(shù)據(jù)收發(fā)由各自獨立的線程完成,這樣不但能夠充分發(fā)揮嵌入式Linux多任務操作系統(tǒng)的優(yōu)勢、實時處理數(shù)據(jù),同時有利于減少系統(tǒng)開銷、提高系統(tǒng)資源利用效率。其中主程序部分需要用戶自行填寫參數(shù)的是以下兩個地方:
// 此處填寫網(wǎng)關路由器的外網(wǎng)IP地址
strcpy( ServerIP, '222.212.15.128' );
// 此處填寫通過實驗室的網(wǎng)關路由器為實驗用PC機分配的端口號
TCPClntManager.AddTCPClientObject( ServerIP, 7051 );
數(shù)據(jù)處理分別在串口數(shù)據(jù)處理線程ReceiveThreadFunc和TCP數(shù)據(jù)處理線程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 );
// 接收串口數(shù)據(jù)處理函數(shù)
if( pSer->m_DatLen > 0 )
{
pSer->PackagePro( pSer->DatBuf, pSer->m_DatLen );
}
// 處理完畢
}
}
}
// 接收串口數(shù)據(jù)處理函數(shù)
int CSerial::PackagePro( char* Buf, int len )
{
// 將接收的數(shù)據(jù)發(fā)送至TCP服務器
CTCPClient* pTCPClnt;
Buf[len] = 0;
// 檢測TCP連接是否打開
if( TCPClntManager.m_TCPClientInfo[0].ConnState == csOPEN )
{
pTCPClnt = (CTCPClient*)TCPClntManager.m_TCPClientInfo[0].pTCPClient;
// 調(diào)用CTCPClient類的發(fā)送函數(shù)將串口接收到的數(shù)據(jù)發(fā)送到TCP服務器
pTCPClnt->SendData( Buf, len );
}
return 1;
}
TCP部分:
// 聲明外部變量CSerial類
extern class CSerial m_Serial;
// TCP數(shù)據(jù)處理線程
int CTCPClient::SocketThreadFunc( void* lparam )
{
CTCPClient *pSocket;
// 得到CTCPClient實例指針
pSocket = (CTCPClient*)lparam;
.
.
.
if (ret > 0)
{
.
.
.
else
{
// 對接收的數(shù)據(jù)進行處理
pSocket->RecvBuf[pSocket->m_nRecvLen] = 0;
// printf( 'RCV:%s\n', pSocket->RecvBuf);
// 調(diào)用CSerial類的發(fā)送函數(shù)將GPRS接收到的數(shù)據(jù)發(fā)送到串口調(diào)試助手
m_Serial.WritePort( pSocket->RecvBuf, pSocket->m_nRecvLen );
// pSocket->SendData( pSocket->RecvBuf, pSocket->m_nRecvLen );
// 處理完畢
}
}
}
-
Linux
+關注
關注
87文章
11296瀏覽量
209358 -
嵌入式主板
+關注
關注
7文章
6085瀏覽量
35303
發(fā)布評論請先 登錄
相關推薦
評論