16V554 的测试代码
//------------------------------------------------------------------------
- #include "AT16C554.H"
- //--------------------------------------------------------------------------------------------------
- code Uint PORTAddrTABLE[PortNumber]={STARTADDR_SERIAL1,
- STARTADDR_SERIAL2,
- STARTADDR_SERIAL3,
- STARTADDR_SERIAL4}; //串口端口地址映射表
- xdata TCommHandle CommDevice[PortNumber];
- sbit reset_16c554 = P1^4; //ST16C554 复位控制线
- //---------------------------------------------------------------------------------------------------
- // Define Private Faction
- //-----------------------------------------------------------------------------------------------------
- bool ReadPortRecBuf(uchar Port,Uchar *Byte);
- bool WritePortSendBuf(uchar Port,Uchar Byte);
- void Port_open(Uchar PortID,Uint Baud);
- //-------------------------------------------------------------------------
- // Define Public Faction
- //-------------------------------------------------------------------------
- bool Init_16c554(void);
- void Port_open(Uchar PortID,Uint Baud);
- //void Port_open(Uchar PortID,int Baud,Uchar DataBitNum,Uchar Parit,Uchar Stop);
- void Port_close(Uchar PortID);
- int Port_Receive(Uchar PortID,void *Buffer,int Count);
- int Port_Send(Uchar PortID,void *Buffer,int Count);
- //---------------------------------------------------------------------------------------------
- // Public Faction Code
- //---------------------------------------------------------------------------------------------
- //---------------------------------------------------------------------------------------------
- // 初始化ST16C554
- //---------------------------------------------------------------------------------------------
- bool Init_16c554(void)
- {
- uchar xdata *ptr;
- uchar i=Init_16c554_Count;
- bool Result=false;
- while(--i) // 复位10次不成功,则返回出错
- {
- _nop_();
- reset_16c554 = FREE_RESET;
- ms_delay(5);
- reset_16c554 = RESET; // 复位16C554
- ms_delay(10); // 延时1毫秒
- reset_16c554 = FREE_RESET;
- ms_delay(10);
- ptr = STARTADDR_SERIAL1+SPR; // 通道1临时寄存器
- *ptr = 0xaa; // 写测试值到临时寄存器
- _nop_();
- _nop_();
- if(*ptr == 0xaa)
- {
- Result=true;
- break;
- };//end if
- };//end while
- for(i=0;i<PortNumber;i++) CommDevice[i].RAMAddress_Map=PORTAddrTABLE[i];
- return Result;
- }
- //---------------------------------------------------------------------------------------------
- // 打开串口
- //---------------------------------------------------------------------------------------------
- void Port_open(Uchar PortID,Uint Baud)
- {
- uchar xdata *ptr;
- ptr = CommDevice[PortID].RAMAddress_Map; // 取端口的基地址
- *(ptr+LCR) = LCR_DIV_EN; // 允许发送波特率
- *(ptr+DLM) = (uchar)(Baud>>8);
- *(ptr+DLL) = (uchar)Baud; // 设置默任波特率为19200
- *(ptr+LCR) = LCR_WORD_LEN8|LCR_STOP_LEN1; // 设置字长为8,1个停止位,无校验位
- *(ptr+FCR) = FIFO_EN|FIFO_TRI_LEVEL_1|FIFO_CLEAR_RCVR|FIFO_CLEAR_XMIT|FIFO_DMA_MODE; // 设置FIFO 控制寄存器
- *(ptr+IER) = IER_TRANSMITHOLD_INT|IER_RECEIVEHOLD_INT; // 设置中断屏蔽寄存器
- *(ptr+MCR) = MCR_INTX_EN; // 允许中断引脚输出
- if(PortID==0) EX0 = true; // 开外部中断0(通道1中断)
- if(PortID==1) EX1 = true; // 开外部中断1(通道2中断)
- if(PortID==2) EX2 = true; // 开外部中断2(通道3中断)
- if(PortID==3) EX3 = true; // 开外部中断3(通道4中断)
- CommDevice[PortID].CommReceive_Head=0;
- CommDevice[PortID].CommReceive_Trail=0;
- CommDevice[PortID].CommSend_Head=0;
- CommDevice[PortID].CommSend_Trail=0;
- CommDevice[PortID].Comm_Stu=SERIAL_STU_FREE;
- }
- //---------------------------------------------------------------------------------------------
- // 关闭指定的端口
- //---------------------------------------------------------------------------------------------
- /*void Port_close(Uchar PortID)
- {
- uchar xdata *ptr;
- ptr = CommDevice[PortID].RAMAddress_Map; // 取端口的基地址
- *(ptr+LCR) = LCR_DIV_Dis; // 禁止发送波特率
- *(ptr+MCR) = MCR_INTX_Dis; // 允许中断引脚输出
- CommDevice[PortID].CommReceive_Head=0;
- CommDevice[PortID].CommReceive_Trail=0;
- CommDevice[PortID].CommSend_Head=0;
- CommDevice[PortID].CommSend_Trail=0;
- CommDevice[PortID].Comm_Stu=SERIAL_STU_FREE;
- if(PortID==0) EX0 = false; // 关外部中断0(通道1中断)
- if(PortID==1) EX1 = false; // 关外部中断1(通道2中断)
- if(PortID==2) EX2 = false; // 关外部中断2(通道3中断)
- if(PortID==3) EX3 = false; // 关外部中断3(通道4中断)
- }*/
- //--------------------------------------------------------------------------------------------------
- //功 能:从串口中接收数据
- //返回值:从串口中接收到的数据个数
- //参 数:
- // Buffer:接收数的缓冲区
- // Count: 想从串口缓冲区中接收数据个数
- //--------------------------------------------------------------------------------------------------
- /*int Port_Receive(uchar Port,register void *Buffer,int Count)
- {
- Uchar Size=0;
- if(Port>PortNumber-1) return Size;
- while((Size<Count)&&(ReadPortRecBuf(Port,Buffer)))
- {
- Size++;
- Buffer=Buffer+1;
- };//end while
- return Size;
- }*/
- //--------------------------------------------------------------------------------------------------
- //功 能:往串口发送数据
- //返回值:已发送的数据个数
- //参 数:
- // Buffer:发送数据的缓冲区
- // Count: 想从串口发送数据的个数
- //--------------------------------------------------------------------------------------------------
- int Port_Send(uchar Port,register void *Buffer,int Count)
- {
- uchar i=0;
- Uchar Size=0;
- uchar xdata *ptr;
- if(Port>PortNumber-1) return Size;
- ptr = CommDevice[Port].RAMAddress_Map; // 取端口基地址
- while(Size<Count)
- {
- if(WritePortSendBuf(Port,*((Uchar *)Buffer)))
- {
- Size=Size+1;
- Buffer=Buffer+1;
- };//end if
- if(CommDevice[Port].Comm_Stu==SERIAL_STU_FREE)
- {
- for(i=0;(i<FIFO_SIZE)&&(CommDevice[Port].CommSend_Head!=CommDevice[Port].CommSend_Trail);i++)
- {
- CommDevice[Port].CommSend_Trail=(CommDevice[Port].CommSend_Trail+1)%CommMaxSendBuffer;
- *(ptr+THR) = CommDevice[Port].CommSendBuffer[CommDevice[Port].CommSend_Trail]; // 发送数据
- };//end for
- CommDevice[Port].Comm_Stu = SERIAL_STU_BUSY;
- };//end if
- };//end while
- return Size;
- }
- //----------------------------------------------------------------------------------------------------
- //----------------------------------------------------------------------------------------------------
- //私有函数
- //----------------------------------------------------------------------------------------------------
- //功 能:从串口接收缓冲区中取得数据
- //返回值:
- // true: 从缓冲区中成功取得数据
- // false: 从缓冲区中无法取得数据
- //参 数: *Byte:从缓冲区中取得数据返回
- //-----------------------------------------------------------------------------------------------------
- /*bool ReadPortRecBuf(uchar Port,Uchar *Byte)
- {
- if(CommDevice[Port].CommReceive_Trail==CommDevice[Port].CommReceive_Head) return false;
- *Byte=CommDevice[Port].CommReceiveBuffer[CommDevice[Port].CommReceive_Trail];
- CommDevice[Port].CommReceive_Trail=(CommDevice[Port].CommReceive_Trail+1)%CommMaxReceiveBuffer;
- return true;
- }*/
- //-----------------------------------------------------------------------------------------------------
- //功 能:往串口发送缓冲区中写数据
- //返回值:
- // true: 往缓冲区中写数据成功
- // false: 从缓冲区中写数据失败
- //参 数: Byte: 往缓冲区中写入的数据
- //------------------------------------------------------------------------------
- bool WritePortSendBuf(uchar Port,Uchar Byte)
- {
- if((CommDevice[Port].CommSend_Head+1)%CommMaxSendBuffer==CommDevice[Port].CommSend_Trail) return false;
- CommDevice[Port].CommSend_Head=(CommDevice[Port].CommSend_Head+1)%CommMaxSendBuffer;
- CommDevice[Port].CommSendBuffer[CommDevice[Port].CommSend_Head]=Byte;
- return true;
- }
- //--------------------------------------------------------------------------------
- // 外部扩展串行口1中断处理程序(外部中断0)
- //--------------------------------------------------------------------------------
- void serial1_int() interrupt 0
- {
- uchar xdata *ptr;
- uchar event;
- uchar port;
- port = CHANL1_PORT;
- ptr = CommDevice[port].RAMAddress_Map; // 读ISR 中断状态寄存器
- event = *(ptr+ISR)&0x0f; // 读最高优先级别的中断码
- _nop_();
- switch(event)
- {
- case EVENT_RXRDY: // 接受数据到中断
- case EVENT_RXRDY_TIMEOUT:
- for(;*(ptr+LSR)&EVENT_LSR_RECEIVE;)
- {
- CommDevice[port].CommReceiveBuffer[CommDevice[port].CommReceive_Head] = *(ptr+RHR);
- if(((CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer)!=CommDevice[port].CommReceive_Trail)
- CommDevice[port].CommReceive_Head=(CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer;
- }; //end for
- break;
- case EVENT_TXRDY: //发送数据中断
- if(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head) //判断数据包是否发送完毕
- {
- for(event=0;(event<FIFO_SIZE)&&(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head);event++)
- {
- CommDevice[port].CommSend_Trail=(CommDevice[port].CommSend_Trail+1)%CommMaxSendBuffer;
- *(ptr+THR) = CommDevice[port].CommSendBuffer[CommDevice[port].CommSend_Trail];
- };//end for
- CommDevice[port].Comm_Stu = SERIAL_STU_BUSY;
- }else CommDevice[port].Comm_Stu = SERIAL_STU_FREE;
- break;
- };//end switch
- }
- //--------------------------------------------------------------------------------
- // 外部扩展串行口2中断处理程序(外部中断2)
- //--------------------------------------------------------------------------------
- void serial2_int() interrupt 2
- {
- uchar xdata *ptr;
- uchar event;
- uchar port;
- port = CHANL2_PORT;
- ptr = CommDevice[port].RAMAddress_Map; //读ISR 中断状态寄存器
- event = *(ptr+ISR)&0x0f; //读最高优先级别的中断码
- _nop_();
- switch(event)
- {
- case EVENT_RXRDY: //接受数据到中断
- case EVENT_RXRDY_TIMEOUT:
- for(;*(ptr+LSR)&EVENT_LSR_RECEIVE;)
- {
- CommDevice[port].CommReceiveBuffer[CommDevice[port].CommReceive_Head] = *(ptr+RHR);
- if(((CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer)!=CommDevice[port].CommReceive_Trail)
- CommDevice[port].CommReceive_Head=(CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer;
- }; //end for
- break;
- case EVENT_TXRDY: //发送数据中断
- if(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head) //判断数据包是否发送完毕
- {
- for(event=0;(event<FIFO_SIZE)&&(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head);event++)
- {
- CommDevice[port].CommSend_Trail=(CommDevice[port].CommSend_Trail+1)%CommMaxSendBuffer;
- *(ptr+THR) = CommDevice[port].CommSendBuffer[CommDevice[port].CommSend_Trail];
- };//end for
- CommDevice[port].Comm_Stu = SERIAL_STU_BUSY;
- }else CommDevice[port].Comm_Stu = SERIAL_STU_FREE;
- break;
- };//end switch
- }
- //--------------------------------------------------------------------------------
- // 外部扩展串行口3中断处理程序(外部中断6)
- //--------------------------------------------------------------------------------
- void serial3_int () interrupt 6
- {
- uchar xdata *ptr;
- uchar event;
- uchar port;
- port = CHANL3_PORT;
- ptr = CommDevice[port].RAMAddress_Map; // 读ISR 中断状态寄存器
- event = *(ptr+ISR)&0x0f; // 读最高优先级别的中断码
- _nop_();
- switch(event)
- {
- case EVENT_RXRDY: // 接受数据到中断
- case EVENT_RXRDY_TIMEOUT:
- for(;*(ptr+LSR)&EVENT_LSR_RECEIVE;)
- {
- CommDevice[port].CommReceiveBuffer[CommDevice[port].CommReceive_Head] = *(ptr+RHR);
- if(((CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer)!=CommDevice[port].CommReceive_Trail)
- CommDevice[port].CommReceive_Head=(CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer;
- }; //end for
- break;
- case EVENT_TXRDY: //发送数据中断
- if(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head) //判断数据包是否发送完毕
- {
- for(event=0;(event<FIFO_SIZE)&&(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head);event++)
- {
- CommDevice[port].CommSend_Trail=(CommDevice[port].CommSend_Trail+1)%CommMaxSendBuffer;
- *(ptr+THR) = CommDevice[port].CommSendBuffer[CommDevice[port].CommSend_Trail];
- };//end for
- CommDevice[port].Comm_Stu = SERIAL_STU_BUSY;
- }else CommDevice[port].Comm_Stu = SERIAL_STU_FREE;
- break;
- };//end switch
- }
- //--------------------------------------------------------------------------------
- // 外部扩展串行口4中断处理程序(外部中断7)
- //--------------------------------------------------------------------------------
- void serial4_int () interrupt 7
- {
- uchar xdata *ptr;
- uchar event;
- uchar port;
- port = CHANL4_PORT;
- ptr = CommDevice[port].RAMAddress_Map; // 读ISR 中断状态寄存器
- event = *(ptr+ISR)&0x0f; // 读最高优先级别的中断码
- _nop_();
- switch(event)
- {
- case EVENT_RXRDY: // 接受数据到中断
- case EVENT_RXRDY_TIMEOUT:
- for(;*(ptr+LSR)&EVENT_LSR_RECEIVE;)
- {
- CommDevice[port].CommReceiveBuffer[CommDevice[port].CommReceive_Head] = *(ptr+RHR);
- if(((CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer)!=CommDevice[port].CommReceive_Trail)
- CommDevice[port].CommReceive_Head=(CommDevice[port].CommReceive_Head+1)%CommMaxReceiveBuffer;
- }; //end for
- break;
- case EVENT_TXRDY: //发送数据中断
- if(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head) //判断数据包是否发送完毕
- {
- for(event=0;(event<FIFO_SIZE)&&(CommDevice[port].CommSend_Trail!=CommDevice[port].CommSend_Head);event++)
- {
- CommDevice[port].CommSend_Trail=(CommDevice[port].CommSend_Trail+1)%CommMaxSendBuffer;
- *(ptr+THR) = CommDevice[port].CommSendBuffer[CommDevice[port].CommSend_Trail];
- };//end for
- CommDevice[port].Comm_Stu = SERIAL_STU_BUSY;
- }else CommDevice[port].Comm_Stu = SERIAL_STU_FREE;
- break;
- };//end switch
- }
- //--------------------------------------------------------------------------------
16V554 的测试代码的更多相关文章
- .NET单元测试的艺术-3.测试代码
开篇:上一篇我们学习单元测试和核心技术:存根.模拟对象和隔离框架,它们是我们进行高质量单元测试的技术基础.本篇会集中在管理和组织单元测试的技术,以及如何确保在真实项目中进行高质量的单元测试. 系列目录 ...
- mysql锁 实战测试代码
存储引擎 支持的锁定 MyISAM 表级锁 MEMORY 表级锁 InnoDB 行级锁 BDB 页面锁 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低.行级锁:开销 ...
- 使用Microsoft Fakes隔离测试代码
在单元测试(Unit Test)中我们遇到的问题之一是:假如被测试组件(类或项目)为A,组件A依赖于组件B,那么在组件A的单元测试ATest中测试A时,也需要依赖于B,在B发生改动后,就可能影响到A的 ...
- iOS开发:XCTest单元测试(附上一个单例的测试代码)
测试驱动开发并不是一个很新鲜的概念了.在我最开始学习程序编写时,最喜欢干的事情就是编写一段代码,然后运行观察结果是否正确.我所学习第一门语言是c语言,用的最多的是在算法设计上,那时候最常做的事情就是编 ...
- 在内核中异步请求设备固件firmware的测试代码
在内核中异步请求设备固件firmware的测试代码 static void ghost_load_firmware_callback(const struct firmware *fw, void * ...
- x264测试代码
建立一个工程,将头文件,库文件加载到工程,测试代码如下:#include <iostream>#include <string>#include "stdint.h& ...
- Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完成测试代码)
MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明 ...
- Git合并开发代码分支到测试代码分支
——转载请注明出自天外归云的博客园 用TortoiseGit下载代码到本地 首先需要在本机安装好TortoiseGit.然后在随便哪个路径下比如D盘,右键“Git Clone”: 然后URL处选择项目 ...
- mvn编写主代码与测试代码
maven编写主代码与测试代码 3.2 编写主代码 项目主代码和测试代码不同,项目的主代码会被打包到最终的构件中(比如jar),而测试代码只在运行测试时用到,不会被打包.默认情况下,Maven假设项目 ...
随机推荐
- idea maven 报-source 1.5 中不支持 diamond 运算符
需要修改 project setting 中的
- Asp.net 在网页编写C#代码示例-- 一个简单的web MsSql 命令执行环境
在给一个客户做的系统上,因为要对数据库进行查看,但之前都是用TeamView来连接到客户的服务器进行数据库操作的 但最近客户那边的TeamView好像更改过密码导致我无法正常连接,而巧了客户的网官因为 ...
- Java中字符串相等与大小比較
在C++中,两个字符串比較的代码能够为: (string1==string2) 但在java中,这个代码即使在两个字符串全然同样的情况下也会返回false Java中必须使用string1.equal ...
- 利用Nginx搭建http和rtmp协议的流媒体服务器[转]
利用nginx搭建http和rtmp协议的流媒体服务器 实验目的:让Nginx支持flv和mp4格式文件,同时支持Rtmp协议:同时打开rtmp的hls功能资料:HTTPLive Streaming( ...
- 算法笔记_045:币值最大化问题(Java)
目录 1 问题描述 2 解决方案 2.1 动态规划法 1 问题描述 给定一排n个硬币,其面值均为正整数c1,c2,...,cn,这些整数并不一定两两不同.请问如何选择硬币,使得在其原始位置互不相邻 ...
- CentOS如何安装linux桌面?
CentOS如何安装linux桌面? 以前默认安装分centos没有图形界面,今天想用下, yum groupinstall "GNOME Desktop" "Graph ...
- C++(一)——HelloWorld
之前学C.学Python,学的比較多的是Java,作为大家口中更强大的C++,要学学,这次的话,以了解主要的特性和做个小游戏作为目标吧. 1)HelloWorld Eclipse执行C++之Launc ...
- Unity3D入门工具介绍(一)
1.UnitySetup-4.1.2.exe安装包 2unity.pro.4.1.2.patch-MPT.exeUnity3D破解补丁 关于Unity3d 可以看下这个 http://book.2c ...
- Git高速入门——Git安装、创建版本号库以及经常使用命令
学习Git最全面的资料,在我看来是这本书--Pro Git,网上关于Git的教程有非常多,包含当中一些非常优秀的教程.这一系列的博客,主要是记录自己学习Git的经历.以及在这一过程中遇到的一些问题. ...
- 旧文备份:简单CANOpen 协议说明
(十年前的旧文,不舍等扔) 创建日期:2005-11-17 修改日期:2005-11-17 文件名称:简单CANOpen 协议说明.doc 作者:winshton 版本:V1.0 (注:本文以24in ...