📄 uart0.c
字号:
{
unsigned char c;
c=Byte;
c=c>>4;PrintCh(c);
c=Byte;c=c&0x0F;PrintCh(c);
}
void PrintWord(unsigned int Word)//以十六进制格式显示1个字数据
{
PrintByte(Word>>8);
PrintByte(Word&0xFF);
}
void PrintLong(unsigned long LongWord)//以十六进制格式显示1个长字数据
{
PrintWord(LongWord>>16);
PrintWord(LongWord&0xFFFF);
}
#endif
/*
*****************************************************************************************************
*Func: 发送一个字符串(SRAM)
*Note:
* 1:
* 2:
*****************************************************************************************************
*/
void Uart0Puts(unsigned char *string)
{
while(*string) {
PrintChar(*string++);
}
}
/*
*****************************************************************************************************
*Func: 发送一个字符串(SRAM) ,长度已知
*Note:
* 1:
* 2:
*****************************************************************************************************
*/
void Uart0Putsl(unsigned char *string,unsigned int length)
{
while(length--) {
PrintChar(*string++);
}
}
/*
*****************************************************************************************************
*Func: 发送一个字符串(flash/code)
*Note:
* 1:
* 2:
*****************************************************************************************************
*/
void Uart0Putf(unsigned char code *string)
{
unsigned char c;
while(*string) {
c=*string++;
PrintChar(c);
}
}
/*
*****************************************************************************************************
*Func: 一侦结束判断 终端到网络的数据
*Note:
* 1: 接收字节时的时间与当前时间比较,过了50MS,且接收缓冲区不为空,为一侦结束
* 2:
*****************************************************************************************************
*/
void FramePush(unsigned char *source,unsigned int length)
{
unsigned int i;
while (FrameIn < MAX_BUF_NUM) {
if (0 == Te2NetBuf[FrameIn].statu) {
for (i=0; i<length; i++) {
Te2NetBuf[FrameIn].buf[i] = source[i]; //拷贝数据
}
Te2NetBuf[FrameIn].statu = 10; //有数据
Te2NetBuf[FrameIn].ttl = 20; //生存时间:单位S
Te2NetBuf[FrameIn].length = length; //长度
FrameIn++;
break;
} else {
FrameIn++;
}
}
if (FrameIn >= MAX_BUF_NUM) {
FrameIn = 0;
}
}
/*
*****************************************************************************************************
*Func: 网络到终端的数据缓冲区
*Note:
* 1:
* 2:
*****************************************************************************************************
*/
void FramePush2(unsigned char *source,unsigned int length)
{
unsigned int i;
while (FrameIn2 < MAX_BUF_NUM2) {
if (0 == Net2TeBuf[FrameIn2].statu) {
for (i=0; i<length; i++) {
Net2TeBuf[FrameIn2].buf[i] = source[i]; //拷贝数据
}
Net2TeBuf[FrameIn2].statu = 10; //有数据
Net2TeBuf[FrameIn2].ttl = 20; //生存时间:单位S
Net2TeBuf[FrameIn2].length = length; //长度
FrameIn2++;
break;
} else {
FrameIn2++;
}
}
if (FrameIn2 >= MAX_BUF_NUM2) {
FrameIn2 = 0;
}
}
/*
*****************************************************************************************************
*Func: 一侦结束判断
*Note:
* 1: LOOPS:比如收到一侦数据5000个,而一侦BUF最大就只有1460个,要循环5000/1460次,每次1460个,
* 2: MOD,是余数,接在后面
* //ES = 0; // 很重要,洪金枝 ES=1在GETCH里恢复
*****************************************************************************************************
*/
void Data2_Te2NetBuf(void)
{
inRxBuf_Bak = inRxBuf; //减少分侦的可能用在Mygetch前
if (TimerMil[T_FRAME_END]) { // 1侦数据未结束
return;
}
Rx0_Counter = 0;
while (Mygetch(&Mid_Buf[Rx0_Counter])) {
if (++Rx0_Counter == MAX_FRAME_SIZE) {
break;
}
}
if (Rx0_Counter == 0) { //FrameEndTime=0,有两种可能1:一侦结束;2:从没数据
return ;
}
if (Rx0_Counter > MAX_FRAME_SIZE) { //保护,其实不会运行到这
return;
}
FramePush(Mid_Buf,Rx0_Counter);
}
/*
*****************************************************************************************************
*Func:
*Note:
*****************************************************************************************************
*/
#ifdef _DEBUG_
void Parse_Ack(unsigned char ack)
{
Uart0Putf("\r\n");
Uart0Putf("第 ");PrintByte(FrameOut);Uart0Putf("侦:");
Uart0Putf("\r\n数据:");Uart0Putsl(Te2NetBuf[FrameOut].buf,Te2NetBuf[FrameOut].length);
Uart0Putf("\r\n");
switch (ack) {
case TRUE:
Uart0Putf("成功:发送成功");
break;
case ERR_BUF_FULL:
Uart0Putf("失败:等待缓冲满)");
break;
case ERR_NO_ESTABLISH:
Uart0Putf("失败:没建立链接");
break;
default:
Uart0Putf("失败:未知\r\n");
break;
}
}
#endif
#ifdef _DEBUG_
#define ParseAck(x) Parse_Ack(x)
#else
#define ParseAck(x)
#endif
/*
*****************************************************************************************************
*Func: 解析数据如果是配置命令,执行配置函数,如果是数据往NET发送
*Note:
* 1: 如果发送失败返回,STATU不清0等待下一次进来再尝试,用生存时间来清statu0
* 2:
//else { //不是配置命令,且未连接,数据先保留
// Uart0Putsl(Te2NetBuf[FrameOut].buf,Te2NetBuf[FrameOut].length);Uart0Putf("\r\n");
//break; //调试用,实际中可以直接跳出,数据先保留
//}
*****************************************************************************************************
*/
void Parse_Te2NetBuf(void)
{
unsigned char ack=0;
while (FrameOut<MAX_BUF_NUM) {
if (Te2NetBuf[FrameOut].statu > 0) { //缓冲区有数据
if ((Te2NetBuf[FrameOut].buf[0] == 'W') && (Te2NetBuf[FrameOut].buf[1] == 'P')
&&(Te2NetBuf[FrameOut].buf[2] == '-')) {
ParseUartCmd(Te2NetBuf[FrameOut].buf,Te2NetBuf[FrameOut].length);//如果是配置命令,解析命令
} else if(bConnect) { //如果已经连接往以太网发送
ack = User_TCPSend(IndexOfClient,Te2NetBuf[FrameOut].buf,Te2NetBuf[FrameOut].length);
ParseAck(ack);
if (ack != TRUE) { //数据发送失败状态不清0,保留数据
break;
}
}
Te2NetBuf[FrameOut++].statu = 0; //清0很重要
break; //处理完一侦退出,不要连续做四侦
} else {
FrameOut++;
}
}
if (FrameOut >= MAX_BUF_NUM) {
FrameOut = 0;
}
}
/*
*****************************************************************************************************
*Func: 解析网络到终端的数据,如果是配置命令,执行配置函数,如果是数据往终端发送
*Note:
* 1: 如果发送失败返回,STATU不清0等待下一次进来再尝试,用生存时间来清statu0
* 2:
_UART_BUF_STRUCT_ xdata Net2TeBuf[MAX_BUF_NUM2]; // 网络到终端
unsigned char xdata FrameIn2; //用来指向Net2TeBuf进入数据的标量
unsigned char xdata FrameOut2; //用来指向Net2TeBuf取出数据的标量
*****************************************************************************************************
*/
void Parse_Net2TeBuf(void)
{
while (FrameOut2 < MAX_BUF_NUM2) {
if (Net2TeBuf[FrameOut2].statu > 0) { //缓冲区有数据
if ((Net2TeBuf[FrameOut2].buf[0] == 'W') && (Net2TeBuf[FrameOut2].buf[1] == 'P')
&&(Net2TeBuf[FrameOut2].buf[2] == '-')) {
ParseRemoteCmd(Net2TeBuf[FrameOut2].buf,Net2TeBuf[FrameOut2].length); //如果是配置命令,解析命令
} else { //不是配置命令,且未连接,数据先保留
#ifdef PROTOCOL_2004
OnReceiveData2004(Net2TeBuf[FrameOut2].buf,Net2TeBuf[FrameOut2].length);//纯数据处理,回调收到数据函数,2004PRO
#else
Uart0Putsl(Net2TeBuf[FrameOut2].buf,Net2TeBuf[FrameOut2].length);
#endif
}
Net2TeBuf[FrameOut2++].statu = 0; //清0很重要
break; //处理完一侦退出,不要连续做四侦
} else {
FrameOut2++;
}
}
if (FrameOut2 >= MAX_BUF_NUM2) {
FrameOut2 = 0;
}
}
/*
*****************************************************************************************************
*Func: 发送心跳包
*Note:
* 1:
* 2:
*****************************************************************************************************
*/
void SendHeart(void)
{
unsigned char heart='$'; // 发送%
FramePush(&heart,1); // 压入缓冲
if (SendHeartFlag == FALSE) {
SendHeartFlag = TRUE; // 置已发标志
TimerSec[T_SOCKET_TTL] = SOCKET_TTL_SEC; // 时间初始化2分钟
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -