📄 comm.c
字号:
#define COMM_FILE
#include "include.h"
//uchar data time;
//uint data r_in=0,r_out=0,t_in=0,t_out=0; /*队列指针*/
//bit r_full=0,t_empty=0,t_done=0;
/*0=接收缓冲区空,1=满;
0=发送缓冲区空,1=正在发送
1=正在发送最后字节;
*/
//uchar xdata t_buf[1024]; /* 串行发送缓冲 */
//uchar xdata r_buf[1024]; /* 串行接收缓冲 */
/*-----------------------------------------------------
; 串口数据块发送程序
; 入口参数: buffer == 数据缓冲区指针
; length == 数据的长度
; 出口参数: 无
-----------------------------------------------------*/
void send_str(uint length,uchar *buffer)
{
do{
if((((t_in+1)^t_out)&0x3ff)!=0) /*t_in+1=t_out 测试缓冲区满*/
{
t_buf[t_in]=*buffer;
buffer++;
t_in=++t_in&0x3ff;
length--;
while(t_done); //如果正在发送最后字节则等待发送完成
if(!t_empty)
{
t_empty=1;
TI=1; //启动新一轮发送
}
}
}while(length);
}
/*-----------------------------------------------------
; 串口字符发送程序
; 入口参数: ch == 欲发送的字符串
; 出口参数: 无
-----------------------------------------------------*/
//void send_char(uchar ch)
//{
// while(1)
// {
// if((((t_in+1)^t_out)&0x3ff)!=0) /*测试缓冲区满*/
// {
// t_buf[t_in]=ch;
// t_in=++t_in&0x3ff;
// while(t_done); //如果正在发送最后字节则等待发送完成
// if(!t_empty)
// {
// t_empty=1;
// TI=1; //启动新一轮发送
// }
// return;
// }
// }
//}
/*--------------------------------------------------------------
等待发送结束
出口参数:
== 0 正确
== 1 超时
--------------------------------------------------------------*/
uchar wait_send_end(void)
{
uchar i;
i = 5;
time = 200; /*设TIME的初值为200,字符间隔时间为1秒*/
do
{
if(!t_empty) {return(0);}
if(!time)
{
time = 200; /*设TIME的初值为200,字符间隔时间为1秒*/
i--;
}
}while(i);
return(1);
}
/*-----------------------------------------------------
; 串口接收程序
; 入口参数: buffer == 数据缓冲区指针
; length == 数据的长度
; 出口参数: == 0 正确
; != 0 超时(TIMEO)
-----------------------------------------------------*/
uchar rece(uint length,uchar *buffer)
{
uchar rece_one; /*==1,已接收了一个字节*/
uint len;
rece_one = 0;
len=0;
time = 200; /*设TIME的初值为200,字符间隔时间为1秒*/
while(time)
{
if(r_out!=r_in) /*缓冲区非空*/
{
buffer[len]=r_buf[r_out];
length--;
r_out=++r_out&0x3ff;
if(length==0) return(0);
time=200; /*字符间隔时间为1秒*/
len++;
}
}
if(len) return(0xd3);
else return(0xd4);
}
/*-----------------------------------------------------
清除串口缓冲区
-----------------------------------------------------*/
void clear_rece_buffer(void)
{
r_out=r_in;
r_full=0;
}
/*-----------------------------------------------------
; 串口接收一行程序
; 入口参数: buffer == 数据缓冲区指针
; 出口参数: == 0 正确
; != 0 超时(TIMEO)
-----------------------------------------------------*/
//uchar receline(uchar *buffer)
//{
// uchar *buf;
// buf=buffer;
// time = 200; /*设TIME的初值为200,字符间隔时间为1秒*/
// while(time)
// {
// if(r_out!=r_in) /*缓冲区非空*/
// {
// *buffer = r_buf[r_out];
// r_out=++r_out&0x3ff;
// time = 200; /*设TIME的初值为200,字符间隔时间为1秒*/
// if(*buffer == 0x0a) return 0;
// buffer++;
// }
// }
// if(buf!=buffer) return 0xd3;
// else return 0xd4;
//}
/*-----------------------------------------------------
; 串口接收1byte程序
; 入口参数: buffer == 数据缓冲区指针
; 出口参数: == 0 没有数据
; == 1 返回1Byte,还有接收数据没有被读取
; == 3 返回1Byte,没有剩余数据
-----------------------------------------------------*/
uchar rece_s(uchar *buffer)
{
if(r_out!=r_in) /*缓冲区非空*/
{
*buffer=r_buf[r_out];
r_out=++r_out&0x3ff;
if(r_out!=r_in) return 1;
return 3;
}
return 0;
}
/***********************************************************************************
接收命令包
***********************************************************************************/
uchar rece_cmd(uchar *cmd,uchar *package,uint *len,uchar *para)
{
uchar error,error1,buf[10],xor;
uint temp,i;
error=rece(2,buf);
#ifdef ZLH_DEBUG
// disp_data(2,"A4");
// disp_data(1,&error);
// disp_data(2,buf);
#endif
if(error){
if((error==0xd3)&&(buf[0]==0x1b)){
error1=rece_s(&buf[1]);
if(error1&&(buf[1]==0x10)) goto RECE_DATA;
}
return OVER_TIME;
}
if(buf[1]==0x1b){
error1=rece_s(&buf[2]);
if(error1&&(buf[2]==0x10)) goto RECE_DATA;
else return OVER_TIME;
}
if((buf[0]!=0x1b)||(buf[1]!=0x10)) return OVER_TIME;
RECE_DATA:
buf[0]=0x1b;buf[1]=0x10;
error=rece(4,&buf[2]);
if(error) return CMD_HEAD_ERR;
*cmd=buf[2];
*package=buf[3];
temp=*((uint *)&buf[4]);
temp=temp-6+1;
error=rece(temp,para);
if(error) return RECE_DATA_ERR;
xor=buf[0];
for(i=1;i<6;i++)
xor^=buf[i];
for(i=0;i<temp-1;i++)
xor^=para[i];
#ifdef ZLH_DEBUG
// disp_data(2,"A4");
// disp_data(1,&xor);
// disp_data(1,¶[temp-1]);
#endif
// if(xor==para[temp-1])
// {
*len=temp-1;
return 0;
// }
// else return XOR_ERR;
}
/****************************************************************************************
发送应答数据包
****************************************************************************************/
uchar send_data(uchar package,uint len,uchar *para)
{
uchar buf[20],xor,j,error;
uint i,temp;
buf[0]='O';buf[1]='K';
buf[2]=package;
temp=len+5;
buf[3]=(uchar)(temp>>8);
buf[4]=(uchar)temp;
xor=buf[0];
for(i=1;i<5;i++)
xor^=buf[i];
if(len){
for(i=0;i<len;i++)
xor^=para[i];
}
for(i=0;i<3;i++){
send_str(5,buf);
if(len) send_str(len,para);
send_str(1,&xor);
clear_rece_buffer();
if(package){
wait_send_end();
for(j=0;j<10;j++){
error=rece(1,&buf[10]);
if((!error)&&((buf[10]==0x32)||(buf[10]==0x33)))
break;
}
if(j==10) continue;
if(buf[10]==0x32) return 0;
}else{
return 0;
}
}
return COMM_ERR;
}
/*****************************************************************************************
发送出错应答
*****************************************************************************************/
void send_error(uchar error)
{
uchar buf[20];
uchar i;
buf[0]='E';
buf[1]='R';
buf[2]=0;
buf[3]=0;buf[4]=6;
buf[5]=error;
buf[6]=buf[0];
for(i=1;i<6;i++)
buf[6]^=buf[i];
send_str(7,buf);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -