[ZLG-ARM] LPC2138的串口接收错误~~~撞墙~~

[复制链接]
3989|10
 楼主| dspinxd 发表于 2007-2-10 17:28 | 显示全部楼层 |阅读模式
仿照HotPower的《LPCARM串口无限FIFO应用举例及祥解》改写.<br />只有接收使用中断方式!我用UART1接modem。如果发送的PPP包为23bytes。<br />7E&nbsp;FF&nbsp;7D&nbsp;23&nbsp;C0&nbsp;21&nbsp;7D&nbsp;23&nbsp;7D&nbsp;21&nbsp;7D&nbsp;20&nbsp;7D&nbsp;28&nbsp;7D&nbsp;23&nbsp;7D&nbsp;24&nbsp;C0&nbsp;23&nbsp;22&nbsp;48&nbsp;7E<br />接收到的也仅为23bytes。<br />7D&nbsp;34&nbsp;7D&nbsp;22&nbsp;7D&nbsp;26&nbsp;7D&nbsp;20&nbsp;7D&nbsp;20&nbsp;7D&nbsp;20&nbsp;7D&nbsp;20&nbsp;7D&nbsp;25&nbsp;7D&nbsp;26&nbsp;52&nbsp;7D&nbsp;38&nbsp;7D&nbsp;30&nbsp;<br />事实上不应该是23bytes,而是多于23bytes的。串口收不到所有,只能在下一次接收剩余的。<br />为什么不能完整接收缓冲中的字符呢?<br />郁闷死啦!<br />U1FCR&nbsp;=&nbsp;0xc3;<br />U1IER&nbsp;=&nbsp;0x05;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />void&nbsp;UART1_Exception(void)<br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(U1IIR&nbsp;&&nbsp;0x0f)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x06:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(U1LSR)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x03:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x04:<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x0c:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(U1LSR&nbsp;&&nbsp;0x01)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_Uart1Wr&nbsp;%=&nbsp;MAX_UART1_BUFFER;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uart1_Buf[p_Uart1Wr++]&nbsp;=&nbsp;U1RBR;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uart1_Useful_Data++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(uart1_Useful_Data&nbsp;&gt&nbsp;MAX_UART1_BUFFER)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uart1_Useful_Data&nbsp;=&nbsp;MAX_UART1_BUFFER;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uart1_Interrupt&nbsp;=&nbsp;TRUE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();<br />}<br />
hotpower 发表于 2007-2-10 18:15 | 显示全部楼层

撞塌了~~~我闪开~~~

倒塌了~~~串口从不和我作对~~~
 楼主| dspinxd 发表于 2007-2-10 18:42 | 显示全部楼层

郁闷~为什么串口就是要和我作对~

  
hotpower 发表于 2007-2-10 22:57 | 显示全部楼层

倒塌了~~~网上我的例程很多,拿来即用.改编肯定要有功力~~~

给你几个例程,都是源码,而且都是网上帖图.<br /><br />LPCARM之GPS应用及使用状态机解码祥解<br /><br />LPCARM之RTC应用举例及日期校验和星期自动调节祥解<br /><br />以上2个例程都含有串口双向通讯,即接收命令和命令的执行.<br /><br />本来想发个IAP全攻略版,这样就可以完成好些人的梦想~~~<br /><br />1.flashrom的2次写入技术.<br />2.&quot;eeprom计数器&quot;,&quot;eeprom数据&quot;.<br />3.hex源码公开下的2次解密及还原技术.<br />4.远程注册并开放用户hex源码公开下的真正程序.<br />n.........<br /><br />由于本源码包含和涉及的方面很多,故只准备公开发表一些最基本的~~~
hotpower 发表于 2007-2-10 23:11 | 显示全部楼层

倒塌了~~~我海量数据传送时把串口通都搞蒙噔了~~~

可菜农的&quot;无限FIFO&quot;还没倒塌~~~最后只好自己编上位机软件,而且也放弃了CVI~~~因为它的CPU占有率太高了~~~<br />哈哈,主要是菜农的&quot;无限FIFO&quot;水利过猛将其灌倒塌了~~~
hotpower 发表于 2007-2-10 23:14 | 显示全部楼层

注意上图的收发都是14039字节~~~

  
xiajiawen 发表于 2007-2-12 12:38 | 显示全部楼层

14039字节还显得小了

菜农有没有试过,上位机海量的发送上数至LPC2200,115200BPS的波特率,发送如下数据:00&nbsp;11&nbsp;22&nbsp;33&nbsp;44&nbsp;55&nbsp;66&nbsp;77&nbsp;88&nbsp;99&nbsp;aa&nbsp;bb&nbsp;cc&nbsp;dd&nbsp;ee&nbsp;ff,发送周期设为10ms,LPC2200接收用FIFO(我跑UCOS),看多长时间会倒塌?<br /><br />我用的串口工具:AccessPort&nbsp;V1.33,这个工具相当不错<br /><br />我这塌得可是没有规律,问题正在查找中...<br /><br />出现的情况一般是:<br />进入如下中断<br /><br />;取指令中止<br />PrefetchAbort<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrefetchAbort<br /><br />;取数据中止<br />DataAbort<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataAbort<br /><br />;快速中断<br />FIQ_Handler<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STMFD&nbsp;&nbsp;&nbsp;SP!,&nbsp;{R0-R3,&nbsp;LR}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FIQ_Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDMFD&nbsp;&nbsp;&nbsp;SP!,&nbsp;{R0-R3,&nbsp;LR}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUBS&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;&nbsp;LR,&nbsp;&nbsp;#4
xiajiawen 发表于 2007-2-12 13:46 | 显示全部楼层

关于串口FIFO接收处理时出现DataAbort的问题

程序不做任何修改,以上的测试条件不变,SmartARM2200换用不同的PACK(LPC2210,LPC2214,LPC2220),出现DataAbort的频率不同,LPC2210是原配的,最容易出现DataAbort,LPC2214稳定些(在调试LCD时亦出现过LPC2214比LPC2210要稳的现象,最终的解决方法是某些电路做了一定修改)<br /><br />使用LPC2210,改变一下条件,计算机串口发送周期设改为100ms,测试接收几十万数据不再出现DataAbort<br /><br />LPC22XX的脾气,还没有摸透......
hotpower 发表于 2007-2-12 17:54 | 显示全部楼层

快速中断没必要保护现场~~~

实际我也是发送的32KB.<br />发送间隔小出错几率肯定大,这估计和上位机也有很大关系.<br />在应用中界面和串口程序都是自己做的,海量传送就没问题.<br />CVI不能满足需要.
xiajiawen 发表于 2007-2-12 20:01 | 显示全部楼层

仔细看UART0相关的寄存器,做了修改,现有了很大改善,测试

  
xiajiawen 发表于 2007-2-12 20:07 | 显示全部楼层

已测试接收几百万数据没有问题,吃了饭再继续....

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

18

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部