📄 串口通讯.h
字号:
/* Public: */
/* CommRecBufferTail 接收缓冲区尾指针,用于判断数据接收完否 */
/* CommRecBufferHead 从接收缓冲区读取数据后,头指针加一 */
/* CommRecBuffer定 接收缓冲区,用于存放接收到的数据 */
{
unsigned char ch;
while(CommRecBufferHead==CommRecBufferTail); //无字符则等待
ch=CommRecBuffer[CommRecBufferHead];
CommRecBufferHead++;
if (CommRecBufferHead==REC_MAXSIZE){ //指针到头回零
CommRecBufferHead=0;
}
if(CommRecBufferHead==CommRecBufferTail) FlagRecComm=0;
return ch;
}
//串口关闭函数
void s_close( void )
/* s_close: 串行口关闭函数 */
/* */
/* Input : */
/* 无 */
/* Return : 无 */
{
ES=0; // close the serial interrupt
}
//定时器0中断处理函数
void timer0(void) interrupt 1
/* timer0: 定时器中断处理子程序 */
/* */
/* Input : */
/* 无 */
/* Return : 无 */
/* Public: */
/* time0:定时计数器 */
/* pre_time:预设时间 */
/* time_flag:定时到标志 */
{
TR0=0;
TH0=0x70;//0xb8;//70; /*20ms定时*/
TL0=0x00;//0x00;//00;
time0=time0+1;
if(time0>=pre_time){
time_flag=1;
time0=0;
}
TR0=1;
return;
}
//定时函数
void time_count(unsigned int time)
/* time_count : 定时器函数,产生一定定时 */
/* */
/* Input : */
/* time 定时时间常数 */
/* Return : 无 */
/* time0:定时计数器 */
/* pre_time:预设时间 */
/* time_flag:定时到标志 */
{
time0=0;
time_flag=0;
pre_time=time;
return;
}
//浮点数字节对换
float float_swap(float data_swap)
/* float_swap : 浮点数存储格式转换 */
/* */
/* Input : */
/* data_swap 要转换的数据 */
/* Return : 转换完的数据 */
{
union{
float input_float;
unsigned char input_char[4];
}input_data;
unsigned char tmp;
input_data.input_float=data_swap;
tmp=input_data.input_char[0];
input_data.input_char[0]=input_data.input_char[3];
input_data.input_char[3]=tmp;
tmp=input_data.input_char[1];
input_data.input_char[1]=input_data.input_char[2];
input_data.input_char[2]=tmp;
return(input_data.input_float);
}
//整数字节对换
int int_swap(int data_swap)
/* int_swap : 整数存储格式转换 */
/* */
/* Input : */
/* data_swap 要转换的数据 */
/* Return : 转换完的数据 */
{
union{
int input_int;
unsigned char input_char[2];
}input_data;
unsigned char tmp;
input_data.input_int=data_swap;
tmp=input_data.input_char[0];
input_data.input_char[0]=input_data.input_char[1];
input_data.input_char[1]=tmp;
return(input_data.input_int);
}
//长整型字节对换
long int long_int_swap(long int data_swap)
/* long_int_swap : 长整数存储格式转换 */
/* */
/* Input : */
/* data_swap 要转换的数据 */
/* Return : 转换完的数据 */
{
union{
long int input_long_int;
unsigned char input_char[4];
}input_data;
unsigned char tmp;
input_data.input_long_int=data_swap;
tmp=input_data.input_char[0];
input_data.input_char[0]=input_data.input_char[3];
input_data.input_char[3]=tmp;
tmp=input_data.input_char[1];
input_data.input_char[1]=input_data.input_char[2];
input_data.input_char[2]=tmp;
return(input_data.input_long_int);
}
//系统握手
unsigned char sys_done(void)
/* sys_done : 系统握手及应答 */
/* */
/* Input : */
/* 无 */
/* Return : 握手状态 */
/* Public: */
/* wait_time[]:IMU标定对准的剩余时间 */
{
static unsigned char xdata head[6];
unsigned char temp;
if(s_intflag()<5) return(0);
while((temp=s_read())!='$'){
if(s_intflag()<5) return(0);
}
head[0]=temp;
head[1]=s_read();
head[2]=s_read();
head[3]=s_read();
head[4]=s_read();
head[5]='\0';
if(strcmp(head,"$DONE")==0) return(1); //导航系统准备好
if(strcmp(head,"$FAIL")==0) return(2); //初始参数接收失败
if(strcmp(head,"$GOOD")==0) return(3); //初始参数接收成功
if(strcmp(head,"$OVER")==0) return(4); //IMU标定对准完成
if(head[3]==' '&&head[4]=='A'){ //IMU标定对准剩余时间
wait_time[0]=head[1];
wait_time[1]=head[2];
return(5);
}
if(head[3]==' '&&head[4]=='B'){
wait_time[0]=head[1];
wait_time[1]=head[2];
return(5);
}
return(0);
}
//串口数据接收函数
unsigned char receive_data(void)
/* receive_data : 导航信息接收 */
/* */
/* Input : */
/* 无 */
/* Return : 接收数据的状态 */
/* Public: */
/* rec_ins_data:导航信息共用体 */
{
unsigned char xdata j=0;
unsigned char xdata temp_c,test_code=0;
static unsigned char xdata head[6],rec_data[56],tail[4];
if(s_intflag()<65) return(0); //判缓冲区数据量
while((temp_c=s_read())!='$'){ //寻找数据头
if(s_intflag()<65) return(0);
}
head[0]=temp_c;
head[1]=s_read();
head[2]=s_read();
head[3]=s_read();
head[4]=s_read();
head[5]='\0';
if(strcmp(head,"$NTHR")==0){ //三维系统判断数据头
for(j=0;j<52;j=j+1){
rec_data[j]=s_read();
}
tail[0]=s_read();
tail[1]=s_read();
tail[2]=s_read();
tail[3]=s_read();
if(tail[0]=='*'&&tail[2]=='\r'&&tail[3]=='\n'){
test_code=rec_data[0];
for(j=0;j<51;j=j+1){ //计算校验码
test_code=test_code^rec_data[j+1];
}
for(j=0;j<4;j=j+1){
test_code=test_code^head[j+1];
}
}
if(test_code==tail[1]){ //校验码无误,数据接收
for(j=0;j<52;j=j+1){
rec_three.tra_data[j]=rec_data[j];
}
//////////////////数据格式转换//////////////////////
rec_three.ins_data.sinstime=long_int_swap(rec_three.ins_data.sinstime);
rec_three.ins_data.attitude1=float_swap(rec_three.ins_data.attitude1);
rec_three.ins_data.attitude2=float_swap(rec_three.ins_data.attitude2);
rec_three.ins_data.attitude3=float_swap(rec_three.ins_data.attitude3);
rec_three.ins_data.ang_rate1=float_swap(rec_three.ins_data.ang_rate1);
rec_three.ins_data.ang_rate2=float_swap(rec_three.ins_data.ang_rate2);
rec_three.ins_data.ang_rate3=float_swap(rec_three.ins_data.ang_rate3);
rec_three.ins_data.pos_integer1=float_swap(rec_three.ins_data.pos_integer1);
rec_three.ins_data.pos_integer2=float_swap(rec_three.ins_data.pos_integer2);
rec_three.ins_data.pos_integer3=float_swap(rec_three.ins_data.pos_integer3);
rec_three.ins_data.pos_decimal1=float_swap(rec_three.ins_data.pos_decimal1);
rec_three.ins_data.pos_decimal2=float_swap(rec_three.ins_data.pos_decimal2);
rec_three.ins_data.pos_decimal3=float_swap(rec_three.ins_data.pos_decimal3);
sys_flag=1;
return(1);
}
}
///////////////////////////
if(strcmp(head,"$NATT")==0){ //航姿系统判断数据头
for(j=0;j<28;j=j+1){
rec_data[j]=s_read();
}
tail[0]=s_read();
tail[1]=s_read();
tail[2]=s_read();
tail[3]=s_read();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -