用C编写的RS232串口通信程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void main()
{
delayms(100);
init(); //初始化系统
delayms(100);
init_wdt(); //初始化看门狗
while(1)
{
while(!RI_0) //是否收到数据
{
clr_wdt();
}
RI_0=0; //清除接收中断标志
buffer=S0BUF;
if(buffer==0x5a) //检测祯头0
start0=1;
if(buffer==0x54) //检测祯头1
start1=1;
if(buffer==0x5a) //检测祯尾0
end0=1;
if(buffer==0xfe) //检测祯尾1
end1=1;
if((start0==1)&(start1==1))
{
buff[i]=buffer; //从祯头1开始存储数据
i++;
}
if((end0==1)&(end1==1)) //是否已经接收祯尾
{
count=i; //数据长度为count个
i=1;
if((buff[2]==0x03)&(count==107)) //是否422指令 {
buff[0]=0x5a; //重填祯头0
buff[count-4]=0; //校验和清零
for(k=2;k<(count-4);k++) //计算校验和
{
buff[count-4]+=buff[k];
}
for(k=0;k { S0BUF=buff[k]; while(!TI_0); //等待发送完成 TI_0=0; //清除发送中断标志 } reset(); } else if((buff[2]==0x05)&(count==7)) //是否AD测试指令 { sendad(); reset(); } else if((buff[2]==0x18)&(count==7)) //是否发送时序信号指令 { sendpaulse(); reset(); } else //如果接收错误,则恢复各标志位为初始状态以便下次接收 { reset(); } } } } void reset() { start0=0; //祯头祯尾标志位清零 start1=0; end0=0; end1=0; for(k=0;k { buff[k]=0x00; //缓冲区清零 } count=0; //计数清零 }