原文:
http://www.gjwtech.com/scomm/c51testcomm.htm通信协议:第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和。
测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。
//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的 //程序编写: 龚建伟 webmaster@gjwtech.com //技术主页:http://www.gjwtech.com //您有这方面的问题可以和我讨论 #include <reg51.h>
#include <string.h>
#define INBUF_LEN
4 //数据长度unsigned char inbuf1[INBUF_LEN];
unsigned char checksum,count3;
bit read_flag=
0;
void init_serialcomm(
void)
{
SCON =
0x50;
//SCON: serail mode 1, 8-bit UART, enable ucvr TMOD |=
0x20;
//TMOD: timer 1, mode 2, 8-bit reload PCON |=
0x80;
//SMOD=1; TH1 =
0xF4;
//Baud:4800 fosc=11.0592MHz IE |=
0x90;
//Enable Serial Interrupt TR1 =
1;
// timer 1 run // TI=1; }
//向串口发送一个字符 void send_char_com(
unsigned char ch)
{
SBUF=ch;
while(TI==
0);
TI=
0;
}
//向串口发送一个字符串,strlen为该字符串长度 void send_string_com(
unsigned char *str,
unsigned int strlen)
{
unsigned int k=
0;
do {
send_char_com(*(str + k));
k++;
}
while(k < strlen);
}
//串口接收中断函数 void serial () interrupt
4 using
3 {
if(RI)
{
unsigned char ch;
RI =
0;
ch=SBUF;
if(ch>
127)
{
count3=
0;
inbuf1[count3]=ch;
checksum= ch-
128;
}
else {
count3++;
inbuf1[count3]=ch;
checksum ^= ch;
if( (count3==(INBUF_LEN-
1)) && (!checksum) )
{
read_flag=
1;
//如果串口接收的数据达到INBUF_LEN个,且校验没错, //就置位取数标志 }
}
}
}
main()
{
init_serialcomm();
//初始化串口 while(
1)
{
if(read_flag)
//如果取数标志已置位,就将读到的数从串口发出 {
read_flag=
0;
//取数标志清0 send_string_com(inbuf1,INBUF_LEN);
}
}
}