📄 sci.c
字号:
//-------------------------------//
//---sci.c-----------------------//
//-------------------------------//
#include "sci.h"
extern char SciRecBuf[INBUF_LEN];
char SciRecData[10];
extern unsigned int read_flag;
extern unsigned long Encode_counter;
extern ulong Maxest_counter;
extern uchar ucSq;
extern char pc_qubai,pc_tuixiao,pc_impact,pc_fangbai;
extern unsigned int ReadArr[10];
//void inline enable_int();
char uldata_fh;
char cParaNo;
extern unsigned int uipreangle;
int ltoascii(long val,char *buffer,int n);
int ltofascii(long val,char *buffer, int n);
//-------------------------------------------//
//------void sci_init(void)------------------//
//-----串口初始化----------------------------//
//-------------------------------------------//
unsigned int Len_RecChar;
int uiRecNum;
void sci_init(void)
{
disable_int();
*SCSR1=*SCSR1|0x0040; //enable SCI clock//
*MCRA=*MCRA|0x0003; //enable TXD and RXD//
*SCICCR=0x07; //1 stop bit ,no even(odd)check,8bitdata;
*SCICTL1=0x0013; //no RX ERR,SCI SRESET,no TXWAKE,no sleep,enable TX & RX;
*SCICTL2=0x0002; //enable RX int,disable TX int;03:enable TX & RX int;
*SCIHBAUD=(BAUD_9600_40M/0x100); //BAUD : 9600bps;
*SCILBAUD=(BAUD_9600_40M%0x100);
*SCIPRI = 0x00; //SCI为高优先级中断
*SCICTL1=0x0033; //使SCI脱离复位状态;
*PADATDIR=*PADATDIR|0x0003;
*IMR = *IMR|0x01;
enable_int();
}
//--------------------------------------//
//---viod send_char_com(uchar ch)------//
//-------------------------------------//
void send_char_com( unsigned char ch)
{
while ((*SCICTL2 & 0x0080) == 0x0000)
{
delay(0x01);
} ;
*SCITXBUF = ch;
while ((*SCICTL2 & 0x0040) == 0x0000)
{
delay(0x1);
} ;
// delay(0xff);
}
//----------------------------------------------------------------//
//void send_string_com(uchar *str, uint strlen)-------------------//
//----send string to serial port ---------------------------------//
//----------------------------------------------------------------//
void send_string_com(char *str, unsigned int strlen)
{
unsigned int k ;
k=0;
do
{
send_char_com(*(str + k));
k++;
}
while (k < strlen);
}
//-----------------------------------------------------------//
//----unsinged int send_num_com(unsigned long ul_x,unsigned int n_bit);--------//
//----send a ulong num to the serial port--------------------//
//-----------------------------------------------------------//
unsigned int send_num_com(unsigned long ul_x,unsigned int n_bit)
{
unsigned char asi_num[20];
int i;
for (i = 0; i<n_bit ; i++)
{
asi_num[i]= (unsigned char)(ul_x%10 + 0x30);
ul_x = ul_x/10;
}
i = 0;
// if(uldata_fh == 0x2d)
// {
// send_char_com(0x2d);
// i = 1;
// }
for( ; i<n_bit ;i++ )
{
send_char_com(asi_num[n_bit-1-i]);
}
return(0);
}
//-------------------------------------//
//-----unsinged int test_sci(void)-----//
//-------------------------------------//
unsigned int test_sci(void)
{
unsigned int data_to_send,data_received;
if(read_flag == 1)
{
// *PBDATDIR = *PBDATDIR | 0xffff;
DIE_H;
delay(0x10);
send_num_com(Encode_counter,6);
send_string_com(SciRecBuf,Len_RecChar);
while ((*SCICTL2&0x0040) == 0x0000)
{delay(0x01);
} ;
delay(0xff);
//*PBDATDIR=*PBDATDIR & 0xfffb;
DIE_L;
delay(0xff);
enable_int();
Len_RecChar = 0;
read_flag = 0;
}
// *PBDATDIR=*PBDATDIR | 0xffff;
// data_to_send=0x005a;
// *SCITXBUF=data_to_send;
// while ( * SCICTL2 & 0x0040 == 0x0040) ;
// *PBDATDIR=*PBDATDIR & 0xfffb;
/*while(*IFR!=0x0010|*PIVR!=0x0006);*/
// while((*SCIRXST&0x0040)==0x0000);
// data_received= *SCIRXBUF;
// if(data_received!=0x005a)return(0);
// return(1);
return(0);
}
//--------------------------------------//
//-----void UartRec()-------------------//
//--------------------------------------//
void UartRec()
{
unsigned char ch;
ch = *SCIRXBUF;
if(read_flag==0)
{
if(ch == 0x05)
{
uiRecNum = 0;
Len_RecChar = 0;
}
if(ch == EOT || uiRecNum>=INBUF_LEN) //接收结束,收到0X0A
{
// disable_int();
read_flag = 1;
SciRecBuf[uiRecNum++] = ch;
Len_RecChar = uiRecNum;
uiRecNum=0;
}
else
{
if (ch > 127 ) //if1
{
uiRecNum = 0 ;
SciRecBuf[uiRecNum] = ch;
}
else
{
SciRecBuf[uiRecNum] = ch;
uiRecNum++;
// Len_RecChar++;
} //endif1
}//endif
}//endif !read_flag
*IFR = 0x0001;
delay(0xf);
// enable_int();
}
//----------------------------------------------------------------//
//-------checksum.c-----------------------------------------------//
//-------求校验和--------------------------------------------------//
//----------------------------------------------------------------//
//-----------------------------------------------------------------//
//------uchar chksum(uchar *p,uchar a, uchar n)--------------------//
//-----uchar checksum(要求校验和的数组,偏移量,共几个字节)-------//
//----返回校验和---------------------------------------------------//
//-----------------------------------------------------------------//
uchar chkxor(char *p,uint a,uint n)
{
uint i;
uchar checkxor;
i=0;
checkxor=0;
for(i=0;i<n;i++)
{
checkxor ^= p[a+i];
}
return (checkxor);
}
uchar chksum(char *p,uint a,uint n)
{
uint i;
uchar checksum;
i=0;
checksum=0;
for(i=0;i<n;i++)
{
checksum += p[a+i];
}
return checksum;
}
// 指令代码义:
//收到00时,只发送实时数据
//收00 :05 30 32 30 30 30 32 0A
//发实时:02(STX1) 30 32(ADD2.3)3x(SQ4)'C'(flag5)data(6~15,实时脉冲)03(ETX16)
//----checkxor(17.18) 0xa(over19).
//收到01时,发送当前最大值
//发01: 05 30 32 30 31 30 33 0A
//发最大:02(STX1) 30 32(ADD2.3)3x(SQ4)'M'(flag5)data(6~15,最大值脉冲)03(end16)
//----checkxor(17.18) 0xa(over).
//收到11时,取摆按下,收到21时:取摆松开
//收11: 05 30 32 31 31 30 32 0A || 收21: 05 30 32 32 31 30 31 0A
//收到12时,退销按下,收到22时:退销松开
//收12: 05 30 32 31 32 30 31 0A || 收22: 05 30 32 32 32 30 32 0A
//收到13时,冲击按下,收到23时:冲击松开
//收13: 05 30 32 31 33 30 30 0A || 收23: 05 30 32 32 33 30 33 0A
//收到14时,放摆按下,收到24时:放摆松开
//收14: 05 30 32 31 34 30 37 0A || 收24: 05 30 32 32 34 30 34 0A
//收到30时,清零处理;所有位恢复初始状态
//发30: 05 30 32 33 30 30 31 0A
//收到40时,写入PLC的变量区,即实际最大扬角的脉冲值
//发40及数据:05 30 32 34 30 xx xx xx xx xx xx xx xx AA AA 0A (16)
//收到41时,写入三段的取摆速度,共8位,依次为s0,s0,S1,s1,s2,s2,s3,s3;
//2020为空,s1s1为低
//发41: 05 30 32 34 31 s0 s0 s1 s1 s2 s2 s3 s3 AA AA 0A (16)
//以上动作正常时回送:06(ACK) 30 32(ADD) 0A(LF)
//不正常时回送:H15(NAK) 30 32(ADD)XX(error code) H0A;
//-------------------------------------------------------------//
//--uint SendSci(unsigned char plc_ad,uchar para,ulong uldata,uint n)--//
//--(DSP号,参数号,参数,位数)------------------------------------------//
//-------------------------------------//
uint SendSci(unsigned char dsp_ad,uchar para,ulong uldata,uint n)
{
uint i;
uchar checks;
char OutBuf[20];
i=0;
// uchar chksum = 0x3A;
if(uldata % 65536 > 0x7fff)
{
uldata = ~(uint)uldata + 1;
uldata_fh = 0x2d;
}
else
{
uldata_fh = 0x30;
}
i = ltoascii((long)dsp_ad,OutBuf,2);
// i += ltoascii((long)ucSq,OutBuf+i,1);
// i += ltoascii((long)para,OutBuf+i,1);
i += ltoascii((long)uldata,OutBuf+i,10);
/*
i = sprintf(OutBuf,"%02d",(uint)dsp_ad);
i += sprintf(OutBuf+i,"%01d",(char)ucSq);
i += sprintf(OutBuf+i,"%01d",(uint)para);
i += sprintf(OutBuf+i,"%010ld",(ulong)uldata);
*/
if(uldata_fh == 0x2d)
{
OutBuf[5] = 0x2d;
}
checks = chkxor(OutBuf,0,i);
checks = checks ^ para;
checks = checks ^ ucSq;
ltofascii((long)(checks),OutBuf,2);
send_char_com(0x02);//STX
send_num_com(dsp_ad,2); //dsp_ad
send_char_com(ucSq); //SQ
send_char_com(para); //C or M
send_char_com(uldata_fh);
send_num_com(uldata,n-1); //the num of pulse
send_char_com(0x03); //ETX
send_string_com(OutBuf,2);//checksum
// send_string_com(p, 16); //(plc_ad + para + 要发
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -