⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_cx.c

📁 新加坡IWOW公司TR800彩信模块的测试代码
💻 C
📖 第 1 页 / 共 2 页
字号:
			break;
		}
        	pic++;
	}
    picLenth = i;
	temp = 1;
	while(1)
	{
	    if(temp == 1)
		{
			temp = 0;
            receive_OK = 0;
            receive_ERROR = 0;  //删除旧图片
            send_m_byte("at$fdel=\"test1.jpg\"\r\n",21);
            while((receive_OK == 0) && (receive_ERROR == 0)) ;
            receive_ERROR  = 0;
            receive_DOWNFINE = 0;
			send_m_byte("at$fupl=\"test1.jpg\"\r\n",21);        //下载图片
            while (1)
            {
                if(receive_DOWNFINE == 1)              //测试是否收到  Ok_Info_FileUploadStarted
                {
                    _nop_();
                    break;
                }
                if(receive_ERROR == 1)                 //测试是否收到  ERROR
                {
                    _nop_();
                    break;
                }
            }
            receive_C = 0;                             //测试是否收到  C
            while (receive_C == 0);
		    xmodedata = send_packet_data(test_pic1,1000);
            _nop_();
		}
  	}
}

void send_a_byte(uchar temp)
{
	SBUF = temp;
	sending = 1;                                              //启用中断发送一个字节
	while(sending == 1);
}
void send_m_byte(uchar *string, uint length)
{
	uint i;                                                    //发送多字节
	for(i = 0; i< length; i++)
	{
		send_a_byte(string[i]);
	}
}
uchar xModemSend(uchar *temp_data, uint length)
{
	*temp_data = 0;
	 length = 0;
     return 0;
}

uchar getchar(void)
{
   // PS=0;
ES=0;
    while (RI == 0);
    RI = 0;
//	PS=1;
ES=1;
    return SBUF;
}
//                     信息包序号                  包里面的数据     收接收方反回来的信息
uchar tx_packet(uchar packet_number,uchar xdata * packet_data_buffer, uchar temp_char )
{
	uchar attempt;
	uint checksum;
	uchar buffer_index;
    for(attempt = 1; attempt <= MAX_TX_TRY; attempt++)
    {
        checksum= 0;                          //校验和为0
        send_a_byte(SOH);                     // send start of packet(sending标志中断发送)
        send_a_byte(packet_number);           //发送信息包序号
        send_a_byte(255 - packet_number);     //发送信息包序号的补码
        //以下为发送数据
        for(buffer_index = 0; buffer_index < PACKET_DATA_BUFFER_LENGTH; buffer_index++)
        {
            send_a_byte(packet_data_buffer[buffer_index]); //发送128个字节
            if (temp_char == NAK) //接收方返回NAK则发送方要得传
		  	checksum += packet_data_buffer[buffer_index]; //计算校验和
            else
            checksum = update_CRC(packet_data_buffer[buffer_index], checksum); //CRC校验和
        }
        if (temp_char == ASCII_C) //如果收到C
		     send_a_byte((uchar)((checksum>>8) & 0x00ff));
             send_a_byte((uchar)(checksum & 0x00ff));   // send end of packet CRC
        temp_char = getchar();            // get receiver response
        if (temp_char == CAN)
          return 0;  // reception cancelled
        if (temp_char == ACK)
          return 1;  // packet received okay
    }
    return 0;                             // attempts exhausted
}

/*
function: 以XMODEM 发送数据
in:  user_data  是数据指针
out: 1    sucess
       o    faile
使用全局变量? 无

*/

bit send_packet_data(uchar code *User_Data , uint LEN)
{
    struct  Message  xdata Xmodem_Pack22;
	struct  Message  xdata *xModem;

    uint i,j=0;
    unsigned char packet_number = 1;
    unsigned char no_more = 0;
    unsigned char temp_char = 0;
    xModem=&Xmodem_Pack22;
	xModem->User_Data=0;
 //	xModem->User_Data=User_Data;
  //只要没有收到ACK(crc校验) 和NAK(校验和)信号就一直在这里等
    while((temp_char != ASCII_C) && (temp_char != NAK))
	{
		  temp_char = getchar();// wait till receiver ready(从这里知道temp_char存的是接收方返回来的信息)
		  if(temp_char == CAN)
		  return 0;
    }

	if (LEN < PACKET_DATA_BUFFER_LENGTH)   // 数据区段的长度固定为 128 字节
	{
         for(i=0;i<LEN;i++)
            xModem->Message[i]=(User_Data[j++]);
		 for(i=LEN;i<128;i++)
            xModem->Message[i]=CTRL_Z;
         if(tx_packet(packet_number, xModem->Message, temp_char)==0)
            return 0;
	}
    else
	{
        do
		{
            for(i=0;i<128;i++)
               xModem->Message[i]=(User_Data[j++]);
            if(tx_packet(packet_number, xModem->Message, temp_char)==0)
               return 0;
            packet_number++;
            LEN=LEN-128;
                         
		}while(LEN>=128);
	    if (LEN)
	    {
            for(i=0;i<LEN;i++)
                xModem->Message[i]=(User_Data[j++]);
	        for(i=LEN;i<128;i++)
                xModem->Message[i]=CTRL_Z;
            if( tx_packet(packet_number, xModem->Message, temp_char)==0)
                return 0;
		}
	}

	if (!tx_EOT()) //发送方正常结束要发EOT信号,
       return 0;      // end tx data failed
return 1;   //正常结束
}
uchar tx_EOT(void)
{
    uchar attempt;

    for(attempt = 1; attempt <= MAX_TX_TRY; attempt++)
    {
        send_a_byte(EOT);                    // send file end
        if(getchar() == ACK)
           return 1;       // file end acknowledged  接收方返因ACK信号
    }
    return 0;               // file tx failed
}

uint update_CRC(uchar inData, uint checksum)
{
    return  ((checksum << 8) ^ crc16_table[ (checksum >> 8) ^ inData ]);
}





/*
*************************************
*延时子程序,延时约10×i机器周期     *
*************************************/

void intDelay(uint i)
{
	while(i--);
}




/*
*************************************
*外部0中断处理子程序(并口通信)    *
*************************************
*/
void external0Interrupt(void) interrupt 0				//外部中断0处理程序
{

}



/*
*************************************
*并口接收数据子程序				    *
*返回接收数据是否成功				*
*************************************
*/



/*
*************************************
*定时器0中断处理子程序			    *
*延时10ms							*
*************************************
*/

void timer0Interrupt(void) interrupt 1					//定时器中断处理程序
{
	TH0=0xf8;TL0=0xdb;							        //定时器定时2ms

}

char memcmp_self(char *string1, char *string2 ,lenth)
{
    uchar i;
    for(i = 0; i<lenth; i++)
    {
         if(*string1 != *string2)
             return 0;
         string1++;
         string2++;
    }
    return 1;
}
//char do_serial_data(uchar lenth)
do_serial_data(uchar lenth)
{
	switch (lenth)
	{
		case 0:
				break;
		case 1:
				break;
		case 2:
				if(memcmp(receive_data, DATA_OK,2) == 0)                //检测是否收到 OK
					receive_OK = 1;
				break;
		case 3:
				break;
		case 4:
				break;
		case 5:
                if(memcmp(receive_data, DATA_ERROR, 5) == 0)             //检测是否收到 ERROR
                    receive_ERROR = 1;
				break;
		case 6:
				break;
		case 7:
				break;
		case 8:
				break;
		case 19:
               if(memcmp(receive_data,DATA_DOWNFINE,19))                 //检测是否收到 Ok_Info_FileUploadStarted
                     receive_DOWNFINE = 1;
				break;
		default:
				break;
	}
}



//1MS的延时
void Delay(unsigned int Delay_MS)
{
        unsigned char i;
	while(Delay_MS--)
	{
	   for(i=0;i<111;i++);
	}
}
 
void commInterrupt(void) interrupt 4					//串口中断处理程序
{
	uchar temp;
	if(TI)
	{
		TI=0;
		sending = 0;
	}
	else
	if(RI)
	{
		temp = SBUF;
		RI=0;
        if(temp == 'C')
        {                                         //检测是否收到 C
            receive_C = 1;
        }
        if(temp == '>')
        {                                         //检测是否收到 >
            receive_DAYUHAO = 1;
        }
		if ((temp == CHARGE_LINE) || (temp == ENTER))
		{
			do_serial_data(receive_sp);        //收到回车,接收指针归零  ,并处理接收数据
			receive_sp = 0;
		}
		else
		{
            _nop_();
        	receive_data[receive_sp++] =temp;
        }
         if (receive_sp > 40)                                      //接收超长,接收指针规零
          receive_sp = 0;
	}
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -