1、单片机每“次”确实只能接纳1个字节,但由于串口的速度真实太低,一般都在115200bps以下(即便用了同步方法也“只能”到达1Mbps)。留意,是bps,位/秒,而不是“字节/秒”,这便是“串”行通讯,要至少8个“bps时刻”才干接纳一个完好的字符,事实上,加上开始位等,8个位往往传送不了一个字节(不知道我的了解是不是有误差),这便是说,速度至少还要再慢上8倍。
2、带有USART的单片机里USART一般都是做为“外部设备”,独立于MCU进行收发作业,即其收发进程中的串-并和并-串转化以及数据IO进程都是“自主”和“主动”的,不需求CPU逐位进行收发处理,因而,在CPU将数据送到SBUF后,便能够放手不管了,USART收发器会主动将SBUF的内容转化成串行数据发送出去。接纳时也是由USART将串行数据转成并行数据并存放到SBUF后才会告诉MCU(发生接纳中止)。MCU所需求做的只是往SBUF送数或从SBUF中取数(都只需1个指令周期)。
3、设置串口参数的时分应该能看出,为了习惯串口的慢,不得不动用定时器进行延时,以“发生”所需求的波特率,而这个“延时”一般都要给8位乃至16位定时器设置初值,定时器每一次计数都需求一个指令周期,即CPU能够履行一条指令的时刻,而定时器两次串口溢出才只是接纳或发送一个“位”,接纳一个字节需求数倍于此的时刻,那么这么长的时刻对CPU来说,足以沉着地从SBUF里取出数据并对其进行处理了。
4、即便CPU的使命适当深重,或对接纳到的每个字节都需求进行适当杂乱的处理,咱们也完全能够经过树立接纳缓冲区的方法将暂时来不及处理的数据暂存起来,等CPU空闲时再做处理。而从SBUF取出数据并保存到缓冲区只需求很少的几条指令就能完结,不会影响到串口持续接纳。
5、规范的RS-232协议并非只要TX、RX和GND三个引脚,即便是最简略的9针插口,也专门规划了检测传输状况和收发恳求的针脚。假如单片机真的真实无法及时完结收发动作,也完全能够使用一个口线作为状况标识,使PC能够知道单片机什么时分能够接纳数据,而不会任由数据丢掉。
6、为了添加数据传输的可靠性,很多数据传输时一般都会选用CRC校验方法,并以“包”或“帧”的方法发送有格局约好的字节省,而非单个字符,这样一来,完全能够经过约好一些“通讯协议”的方法,使收发两边都能够及时知道接纳的数据是否完好,并及时重发新发送犯错的数据。
# include
#include
typedef unsigned char unchar ;
unsigned char ch;
bit read_flag= 0 ;
void init_serialcom( void ) //串口通讯初始设定
{
SCON = 0x50 ; //UART为形式1,8位数据,答应接纳
TMOD = 0x20 ; //定时器1为形式2,8位主动重装
PCON = 0x80 ; //SMOD=1;
TH1 = 0xFD ; //Baud:19200 fosc=”11″.0592MHz
TL1 = 0xFD ;
IE = 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
// TI=1;
}
//向串口发送一个字符
void send_char_com( unchar ch)
{
SBUF=ch;
while (TI== 0);
TI= 0 ;
}
//串口接纳中止函数 功用:串口中止。假如有数据从串口发送过来,首先从串口中读出数据,赋给串口缓冲数组,清中止标志(RI和TI中有一个为1就会立刻进入中止服务子程序)
void serial () interrupt 4 using 3
{
if (RI)
{
RI = 0 ;
ch=SBUF;
read_flag= 1 ; //就置位取数标志
}
}
void main()
{
init_serialcom(); //初始化串口
while ( 1 )
{
if (read_flag) //假如取数标志已置位,就将读到的数从串口宣布
{
read_flag= 0 ; //取数标志清0
send_char_com(ch);
}
}
}