串口通信是一种通信接口简写SCI,它可是实现异步和同步两种传输模式。可以思考一下同步和异步的区别。

所谓同步就是接收方和发送方使用的是同一个时钟,步调一致的处理数据。典型的就是CPU和内存,通过总线存取数据。特点就是快,发送方和接收方不需要什么数据格式,数据线上的数据就是当前想读的数据,因为步调一致嘛。但是问题就是双方的速度要一致,且总线要提供时钟信号,否则就无法实现时钟的统一。这样的通信一般都在速度要求高,距离比较近的地方。

异步就是发送数据的一方和接收数据的一方并不是拥有一个统一的时钟,发送方按照一个固定的数据格式发送,接收方也是按照同一个数据格式接受,但是即使时钟不是同一个,但是发送方和接收方所用的时钟的频率必须是一致的(否则在接受数据的时候如果频率不一致不能够辨别预先设置的数据格式,比如如果接收方的时钟太快,那么会把本来是一个周期的低电平认为是两个低电平信号)。目前异步通信使用的是RS232,单片机为了满足这样的协议都自带UART模块,将CPU的同步数据转换为异步数据。

串口通信最基本的来说有一个数据发送端,一个数据接收端,在连接的时候只要发送端连接到接收端那么数据就可以开始工作。H8的串口模块的发送和接受模块都有缓冲寄存器,也就说把数据先写到缓冲里,然后芯片自行将数据拷贝到发送寄存器里发送,接受的时候也是一样。怎样确认发送寄存器或者接受寄存器是不是为空,即可以工作呢?由相应的状态寄存器的标志位来决定。这样一来的话,串口通信的方式就有讲究了,如果状态寄存器的标志位显示当前不能发送,发送寄存器里的数据还没有清空,那么是等待还是立即返回呢?同样,接受的时候,数据还没来标志位还没置位,是等待还是返回呢?一般来说,两种方式都提供,在后面会提到。

   串口通信的另一个问题就是波特率,以什么样的速度发送?

最后就是串口通信的数据格式,前面提到串行异步通信要使用特殊的数据格式:

起始位:一个周期的低电平。在串口通信的无数据阶段是全高电平的,所以一个低电平就标志一个数据包开始传送了。

数据位:7位或者8位的数据位,D0-D7。

检验位:奇\偶校验位。

停止位:两个高电平。

所以,对H8芯片的串口编程主要做以下的工作:

1:选择是否添加奇偶校验位

2:选择传输速度

3:选择是同步还是异步:SMR(CPU启动时默认是异步所以不需要特别设置)。

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(i=0;i<280;i++); /* wait */
6 SCI1.SCR = 0x30; /* TE = 1 , RE = 1 */
7 i = SCI1.SSR;
8 SCI1.SSR = 0x80; /* Clear Error Flag (TDRE=1) */

在发送和接受的时候,因为存在缓冲区不空闲的情况,必须先判断状态寄存器再向缓冲寄存器放读取数据。

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 = i&0x7f;
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 = i&0xbf;
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

AKI-H8串口通信相关推荐

  1. java实现上位机与下位机串口通信

    串口通信是在工程应用中很常见.在上位机与下位机通讯过程中常通过有线的串口进行通信,在低速传输模式下串口通信得到广泛使用.在说个之前先来简单解释一下上位机与下位机的概念. 上位机与下位机 通常上位机指的 ...

  2. python第三方库之学习pyserial库--串口通信

    pyserial串口通信库 1.安装pyserial库 2.填写串口参数的注意事项 3.简单封装一下 4.碰到的bug 1.安装pyserial库 pip install pyserial versi ...

  3. VC串口通信编程-2

    VC串口通信编程 (2009-07-08 13:48:40) 转载▼ Win32串口编程(转:韩耀旭) 在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信 ...

  4. Linux ROS与嵌入式的串口通信

    1.根据ros wiki的官方教程 学习即可,并且有许多例子可供学习 http://wiki.ros.org/rosserial_arduino/Tutorials 2.用ASIO读写设备串行口 AS ...

  5. 投影串口测试程序_【原创】串口通信测试程序

    源代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...

  6. labVIEW与单片机实现串口通信的设计过程

    1.概述 在现代测控系统中,我们经常会采用上位机和下位机的开发控制模式.下位机主要是用来采集数据,可以通过嵌入式控制器.单片机控制器.PLC等来实现.上位机主要是图形界面,用来实时显示采集数据,并进行 ...

  7. chord协议模拟实现_C#.NET和单片机串口通信实现监控单片机数字量输入继电器输出模拟量输入模拟量输出...

    一.必备软件和硬件: 1.C#.NET: 2.单片机开发板: 3.通信电缆. 二.通信参数: 1.数据位:8位 2.校验方式:无校验 3.停止位:1位 4.波特率:9600bps 5.通信协议:自定义 ...

  8. java串口通信DataRecive_串口通信之DataReceive事件触发时机

    环境:Windows PC.本机虚拟COM2连接COM3.串口调试助手COM2发数据 图1 1> ReceivedBytesThreshold为默认值1:2> 一次发送41个字节:3> ...

  9. 读取串口数据_自定义串口通信的相关问题整理

    串口通信是常见的通信方式,串口接口是大部分工控器件标配的通信接口.在项目开发的过程中,也经常遇到进行串口通信的处理.这里就串口通信的部分问题分享给大家. 1.TTL.RS232.RS422.RS458 ...

最新文章

  1. 综述论文要写英文摘要吗_速成本科毕业论文初稿!!!
  2. 多线程与高并发(九):单机压测工具JMH,单机最快MQ - Disruptor原理解析
  3. docker部署web项目_IntelliJ IDEA 部署 Web 项目
  4. 基于PHP采集数据入库程序(二)
  5. 12000.PAC19XX电源监测芯片
  6. 2021年11月Python小屋编程比赛获奖名单
  7. yii2的分页和ajax分页
  8. bzoj 3028 食物——生成函数
  9. 区块链扫盲 | 认知升级,虚拟货币骗子是什么样子的?
  10. multisim 10 基本分析法的应用1
  11. 自动化测试工具Selenium Appium
  12. android极光推送使用,极光推送使用实例(二) Android客户端
  13. 记一次坑爹的RSA旅程____快哭了555555555(来自实验吧的warmup的wp和感想)
  14. 关于STM32F103x系列ISP烧写出现“程序文件不是0x8000000和0x20000000区域的”解决办法。
  15. win7如何修改html图标,Win7如何更改软件图标?Win7更改软件图标的方法
  16. 入门级带你实现一个安卓智能家居APP(1)java版本
  17. paypal付款,PayPal Subscribe和PayPal Check Out的区别
  18. Windows程式开发设计指南(二十一)动态连结程式库
  19. camera相机 its_[Android] Camera ITS/CTS Verifier测试
  20. c语言 最小公倍数与最大公因数

热门文章

  1. 无限踩坑系列(7)-Latex使用Tips
  2. C++primer第十一章 关联容器 11.1使用关联容器 11.2 关联容器概述
  3. 对于Algorand的介绍
  4. Java基础——Java NIO详解(一)
  5. 【Quartz】Spring3.2.9 + Quqrtz2.2.1 实现定时实例
  6. Docker:集装箱式“运输”在软件上的实现
  7. linux中项目部署和日志查看
  8. sql:无法解决 equal to 操作中 Chinese_PRC_CI_AS 和 Chinese_Taiwan_Stroke_CI_AS 之间的排序规则冲突。...
  9. SpringCloud框架搭建+实际例子+讲解+系列五
  10. hdu 6086 -- Rikka with String(AC自动机 + 状压DP)