南京师范大学硕士学位论文
■圈矗菌一C二r鞋_!,二j吼,研nH钳谴61乱■懒硼舶啊嘲啦糯臻翳鳓麓戮翳臻瓣戮搿嬲臻戮{薹l露鳓鬻黼缓麟荔勰爱虢㈣鹑辩§翦骥譬…一i。·l鬻ti-羞曩i -I L¨^
餐纛l舞溯藜 AT+CScA? ▲+CSCA:4+861 3800250500’,1 45
翻踵篓多赫Fi誊薹 OK
鳓黪誊旷—习戮 AT+C瓶GF?
俘J:}囊鸶囊{1 ■攀
+C_IGF:1
。零_i乏|;关闭串口l|| OK
j 。—刳
AT+CIqTH?
涛空接寝区}按收躁停止显示醛曩。i;
矿j。皂碧蠛}鸳荔≥_≥j荔 +CNMI:0,1,0,0,0r懑激囊域霸j赫鬻:
OK
AT+CMGS=023
保存矗岽数据H更改r
:\COIDATA 。 >
’ {/、
蔓蓍 叠{7
曩 。,{
清空重填}藜蘧翁葶藉7颡群@霹夔参圈
F-自动靛送(周期改变后重选)
自动发送月麟; 11000毫秒 鏖遥固r磷濑繇孬r

霎黑篙?|j}。穸游摹蔷 lcounterRESET 捌鼬… l…………一l
在此图中的最后一个命令AT+CMGS=023发送时,明显是有错误了,根据
WaveCom模块说明电子文档,它本应该返回:
AT+CMGS=023
>
所以在接下去发送PDU格式短消息时,WaveCom模块就没有响应。这是发送数据的格式错误所致,改在WINDOWS自带的超级终端中同样发送这些命令,短消息可以成功发出。
5.5.3串口测试串口0主要与变电站自动化模拟系统相连接,而串El 1用来接WaveCom模块。
调试串口主要分为两个阶段。第一阶段,将处理串口的函数写好,并结合上位机的“串口调试助手”实现上下位机的数据互发。第二阶段是使用串口1实现与WaveCom
模块的通信。
第一阶段调试时主要遇到两个问题。第一,串口中断不响应,用示波器观察
UART0的TXD、RXD端,看到有信号进人UART0里的,且经过MAX2323后,RXD
端也是有信号的,而LPC2214没有响应中断。经查是ADS的安装路径不对!这个问题解决后,中断总算是可以进去了。
程序虽然可以进入中断,但它并不能有效地从上位机接收数据。本想将从上位机接收的数据原封不动地再发回上位机,可是事不如愿,从上位机发的数是55,可是程序最终总会停到下图的62行。在首次运行此程序时,不发数据,然后将运行中的程序停下来,PC始终是在主程序里的,而不会跳转到mQ UART0()中断服务程序
49
南京师范大学硕士学位论文里。但向下位机发一个数据55时,程序并没有按照要求,将通过中断接受到的数据
55原封不动地发回到上位机,当把程序停下来时,PC却指在了下图的62行,也就是说程序已经响应了中断。但为什么响应了接收中断,却没有数据传到上位机呢?经查,问题是出在中断服务程序上,当有一个数据从上位机传到ARM,中断标志位置位,UART0响应中断。当退出中断服务程序,由于没有清中断,PC一返回到主程序,
因为中断标志位仍然处于置位状态,程序又一次响应中断,就这样从主程序到中断服务子程序不停的反复循环,致使下图主程序中的第98行没有办法执行。所以导致了没有数据发回到上位机。 解决的方法是:在退出中断服务程序之前,读取UOIIR来清除中断。
93,i while(1)
94 ; I
95 ‘ if(rcv new==1)
0000038c 1 0xe5d600Ul】 1drb I-0 F【r6,舅土j
0000口390 f 0xe3500001】 cmp r0,錾1
00000394[0xlafffffc] bne Ox38c’ j(main+0x74)
96
,t
97 rcv—new 2 0;
00000398[0xe5c6400l】 ot rl=,r唾,【r苏,学1】
9 8 SendByte(rcv_buf);
0000039c i 0:<e5d60000】 l毫zb r0,【=6,雾0]
000003aO[0xebffff93】 bl S白ndByte
’000003a4[0xeafffff8】 b 0238c j(main+Ox741
000003a8:0xe000c000】dcd 0xe000c000 …。
000003ac f 0:e000a8c00】d".-d 0H000a8000 …。
000003bO f Ox40i]00000】dcd Ox400{=10000,..0
口000口3b4[0xe002c000】dcd 0}:e002c000 ….
000003b8[0x000002e8】dcd 0x|=;00092e8.…
99
。 l
100 搿
§i01。。 磁 }
驴S占,”辔void ( )_irqIRQ UART0 void
}57 。I
,58,rcv new=1;
}59 。 rcv bur=UORBRj
}60 乏// if(UOIIR);I
,61 …V_工CVectAddr=Ox00;
一回。,,锈l
//读取FIFO的数据,并清除中断标志
//这一句是周立么j_书上所没有写
//中断处理结束第二阶段使用板上的串口实现与WaveCom模块的通信。因为串口l与串口0是兼容的,所以可以将串口0的函数移植到串口l,经过简单的上下位机通信,证明了移植成功,开始用串口1向WaveCom模块写命令。先用一个最简单的AT指令来测试WaveCom模块有何反映,此时出现了一个关键问题,在单步调试时,WaveCom
模块返回AT<CR><CR>OK<CR>,这也是WaveCom模块接到电脑上所得到的反馈。
但 是 当 程 序 连 续 运 行 时,却 返 回
AT<CR>AT<CR>AT<CR>AT<CR>OK<CR>OK<CR>OK<CR>OK<CR>
AT<CR>AT<CR>OK<CR>OK<CR>,主要程序是这样编写的:
南京师范大学硕士学位论文
while(1)
(
SendBufToUARTl(at,2);I
SendBufToUARTl(enter,2);
if(iRecvSignl>=1)
f
Delay(DELAYl0MS★i0);
iRecvDataNuml=SioReaduARTl(iRecvBufl,i00);
SendBufToUART0(iRecvBufl,iRecvDataNuml);
iRecvSignl=0;
}
}
69、70句实现向WaveCom模块发送一个AT指令:AT<CR>,72"---78句是实现从WaveCom模块接收反馈信息,并将反馈信息通过串口0发到上位机。理论上应该返回AT<CR><CR>OK<CR>,从下图可以看到,反馈的信息是不正确的。
fj熟鬻翟jI:;。ATT
|糍箍位涉葫两习{};盯
}数据位旷—习降K
l停止位11 ■}|ioK
}黟囊。关闭串四臻;|;ioK
鼍煮景芝—瓮警霪耄耄三型j{oK
.鎏塞鎏堕匿爹}-“耩嵌鬣r凋磐两翼嚣藜薯瓣鬻产
『_瀵藜壤捌霉带t一:。j缚3K..i熊垂签缝。|毽剖i瓣甄霹孥霪蒸雾
,凌覆鬻Ij誊攀攀鬻洳一攀鬃曩…。i。答一jij譬i二};;1|
问题分析:当程序发完AT<CR>时,立即检测if(iRewSignl>=1)这一句,当
ARM从WaveCom模块收到第一个返回字节时,若是UARTl的波特率位115200bps,
则收到一个字节的时间为1/115200×8s。当收到一个字节后,UARTl的中断才会被响应,此时iRewSignl才会加1,而在此之前if(iRewSignl>=1)判断非真,程序再次折回到While(1)处开始执行,69、70两句又执行了一次,即又发了一个AT<CR>
指令,如此循环,在响应UARTl中断之前,ARM已给GPRS模块发出了若干个AT
<cl◇指令了,所以会发生返回信息AT<CR>AT<CR>AT<CR>AT<CR>OK<CR>OK
<CI◇OK<CR>OK<CR>AT<CR>AT<CR>OK<CR>0K<CR>的交替现象。把第74句移到71句处,问题就解决了。
5.6系统测试图5—25所示是已经研制成功的“变电站综合自动化模拟系统”,图5.26是远程