建设部网站建筑工程质保期,仓库改造类网站怎么做,算命网站做竞价赚钱,建设网站虚拟主机在哪买串口通信是一种通信接口简写SCI#xff0c;它可是实现异步和同步两种传输模式。可以思考一下同步和异步的区别。 所谓同步就是接收方和发送方使用的是同一个时钟#xff0c;步调一致的处理数据。典型的就是CPU和内存#xff0c;通过总线存取数据。特点就是快#xff0c;发送… 串口通信是一种通信接口简写SCI它可是实现异步和同步两种传输模式。可以思考一下同步和异步的区别。 所谓同步就是接收方和发送方使用的是同一个时钟步调一致的处理数据。典型的就是CPU和内存通过总线存取数据。特点就是快发送方和接收方不需要什么数据格式数据线上的数据就是当前想读的数据因为步调一致嘛。但是问题就是双方的速度要一致且总线要提供时钟信号否则就无法实现时钟的统一。这样的通信一般都在速度要求高距离比较近的地方。 异步就是发送数据的一方和接收数据的一方并不是拥有一个统一的时钟发送方按照一个固定的数据格式发送接收方也是按照同一个数据格式接受但是即使时钟不是同一个但是发送方和接收方所用的时钟的频率必须是一致的否则在接受数据的时候如果频率不一致不能够辨别预先设置的数据格式比如如果接收方的时钟太快那么会把本来是一个周期的低电平认为是两个低电平信号。目前异步通信使用的是RS232单片机为了满足这样的协议都自带UART模块将CPU的同步数据转换为异步数据。 串口通信最基本的来说有一个数据发送端一个数据接收端在连接的时候只要发送端连接到接收端那么数据就可以开始工作。H8的串口模块的发送和接受模块都有缓冲寄存器也就说把数据先写到缓冲里然后芯片自行将数据拷贝到发送寄存器里发送接受的时候也是一样。怎样确认发送寄存器或者接受寄存器是不是为空即可以工作呢由相应的状态寄存器的标志位来决定。这样一来的话串口通信的方式就有讲究了如果状态寄存器的标志位显示当前不能发送发送寄存器里的数据还没有清空那么是等待还是立即返回呢同样接受的时候数据还没来标志位还没置位是等待还是返回呢一般来说两种方式都提供在后面会提到。 串口通信的另一个问题就是波特率以什么样的速度发送 最后就是串口通信的数据格式前面提到串行异步通信要使用特殊的数据格式 起始位一个周期的低电平。在串口通信的无数据阶段是全高电平的所以一个低电平就标志一个数据包开始传送了。 数据位7位或者8位的数据位D0-D7。 检验位奇\偶校验位。 停止位两个高电平。 所以对H8芯片的串口编程主要做以下的工作 1选择是否添加奇偶校验位 2选择传输速度 3选择是同步还是异步SMRCPU启动时默认是异步所以不需要特别设置。 4选择是否是CPU间通信SMR默认为不是。 5选择在送信收信时候是否发生中断SCR默认不产生中断 6开启异步通信SCR默认关闭 7清除错误FLAG 1 int i;2 SCI1.SCR 0;3 SCI1.SMR 0; /* 無し STOP1 */4 SCI1.BRR 80; /* 9600bps 3052 */5 for(i0;i280;i) /* wait */6 SCI1.SCR 0x30; /* TE 1 , RE 1 */7 i SCI1.SSR;8 SCI1.SSR 0x80; /* Clear Error Flag (TDRE1) */ 在发送和接受的时候因为存在缓冲区不空闲的情况必须先判断状态寄存器再向缓冲寄存器放读取数据。 1 void PutSCI(char c) 2 { 3 unsigned char i; 4 while( 1 ) 5 { 6 i SCI1.SSR; 7 if( i 0x80 ) break; 8 } 9 SCI1.TDR c;10 SCI1.SSR i0x7f;11 }12 13 /*14 SCI入力 15 ----------------------------------------------------------------------------16 データを受信するまで待ちつづけます。 17 */18 char GetSCI()19 {20 unsigned char i;21 char c;22 while( 1 )23 {24 i SCI1.SSR;25 if( i 0x40 ) break;26 }27 c SCI1.RDR;28 SCI1.SSR i0xbf;29 return(c);30 }31 32 /*33 SCI入力データチェック 34 ----------------------------------------------------------------------------35 SCIにデータがあるかチェックします。 36 戻り値 1 データあり、0 データなし 37 */38 int ScanSCI()39 {40 if( SCI1.SSR 0x40 ) return(1);41 return(0);42 } 最后一个函数提供了扫描功能仅仅是对状态寄存器的读取。 以上 转载于:https://www.cnblogs.com/cbs-soft/archive/2009/12/28/1634056.html