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

📄 uartcomm.c.bak

📁 是上一个SMS消费机的充值机程序
💻 BAK
字号:
//#include <stdio.h>
//#include <string.h>
//#include <stdlib.h>
#include <api.h>
#include <console.h>
//#include <string.h>
//#include <ctype.h>

#define MAX_BUF_SIZE 1024

extern unsigned char gcCommMsgRow;

/*
 * 断开连接
 */
void UART_disconnect()
{
	typ_UART_stat_word Ustat;
	
//	clr_scr();	
//	move_cursor(0,0);
//	puts("UART_receive");
//	getch();

	Ustat.l_word = UART_stat();
	if (Ustat.bits.UART_on)
	{
		UART_init(UART_OFF);
		sys_msg(SM_GOTO_SLEEP);
	}
}

/* 
 * calc checksun as tcp/ip checksun
 */
unsigned short cal_chksum(const void *addr, int len)
{      
       int nleft=len;
       int sum=0;
       unsigned short *w= (unsigned short *)addr;
       unsigned short answer=0;

       while(nleft>1)
       {       sum+=*w++;
               nleft-=2;
       }
       if( nleft==1)
       {       *(unsigned char *)(&answer)=*(unsigned char *)w;
               sum+=answer;
       }
       sum=(sum>>16)+(sum&0xffff);
       sum+=(sum>>16);
       answer=~sum;
       return answer;
}
/*
// delay subroutine:
void delay_n_ms(int mscnt) {
  	for (;mscnt > 0; mscnt--)
    		delay_1ms();
}
*/
// puts via UART
void UART_puts(unsigned char *buf, int len) {
  	for(; len > 0; len--) {
    		while(UART_send_char(*buf));
    		buf++;
  	}
}

/*
 * 握手建立连接(当作发起端)
 */
 /*
short UART_connect()
{
	typ_msg_word msg_buffer;
        typ_UART_stat_word Ustat;
	unsigned char recBuf[MAX_BUF_SIZE];
	unsigned char sendBuf[6];
	unsigned short checksum=0,recLen=0; 
		
	SPT_set(64);
	UART_disconnect();
	
	msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
		
	UART_init(UART_ON | UART_232_ON | UART_8_DATA_BITS | UART_BAUD_115200);
	UART_fcntl(UART_fcntl(UART_F_INQ) | UART_F_NO_CTS);
	delay_n_ms(3);
	
	//握手数据帧: 一位的起始位:  0xBE 
        //             两位的长度:    0x0006
        //             一位的握手数据:0xAA
        //             两位的校验位
        sendBuf[0] = 0xBE;
        sendBuf[1] = 0x00;
        sendBuf[2] = 0x06;
        sendBuf[3] = 0xAA;
        checksum = cal_chksum((void *)sendBuf, 4);
	sendBuf[4] = checksum >> 8;
	sendBuf[5] = checksum & 0xFF;
	UART_puts(sendBuf,6);
	
        SPT_set(64 );
        while(1)
	{
		msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
		if (msg_buffer.bits.comm_data)
			break;
		if (msg_buffer.bits.time_out)
		{
			UART_disconnect();
			return 1;
		}
	}
	
        //握手回复帧: 一位的起始位:0xBE
        //             两位的长度:0x0001 
        //             一位的握手数据:0x55
        //             两位的校验位
        memset( (void*)recBuf, 0, sizeof(recBuf) );
	do {
		recBuf[recLen++] = (unsigned char)UART_get_char();
		if( 1 == recLen && recBuf[0] != 0xBE )
			recLen = 0;
		else if ( recLen > 3 && recLen == ( (((unsigned short)recBuf[1])<<8) + recBuf[2] ) )
			break;
		else if ( recLen == 6 )
			break;
		Ustat.l_word = UART_stat();
        } while (Ustat.bits.buff_data_available);
        
        if ( recLen != 6 || recBuf[0] != 0xBE || recBuf[3] != 0x55 || cal_chksum( (unsigned short *)recBuf,recLen) )
        {
 		UART_disconnect();       
        	return 3;
        }
	
	return 0;
}
*/
/*
 * 握手建立连接(当作响应端)
 */
short UART_open()
{
	typ_msg_word msg_buffer;
        typ_UART_stat_word Ustat;
	unsigned char recBuf[MAX_BUF_SIZE];
	unsigned char sendBuf[6];
	unsigned short checksum=0,recLen=0; 
		
	SPT_set(64);
	UART_disconnect();
	
	msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
	
	UART_init(UART_ON | UART_232_ON | UART_8_DATA_BITS | UART_BAUD_115200);
	UART_fcntl(UART_fcntl(UART_F_INQ) | UART_F_NO_CTS);
	delay_n_ms(3);
	
	SPT_set(64);
/*	
	while(1)
	{
		msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
		if (msg_buffer.bits.comm_data)
			break;
		if (msg_buffer.bits.time_out)
		{
			UART_disconnect();
			return 1;
		}
	}

        memset( (void*)recBuf,0,sizeof(recBuf) );
	do {
		recBuf[recLen++] = (unsigned char)UART_get_char();
		if( 1 == recLen && recBuf[0] != 0xBE )
			recLen = 0;
		else if ( recLen > 3 && recLen == ( (((unsigned short)recBuf[1])<<8) + recBuf[2] ) )
			break;
		else if (recLen == 6)
			break;
		Ustat.l_word = UART_stat();
        } while (Ustat.bits.buff_data_available);        
        
        if ( recLen != 6 || recBuf[0] != 0xBE || recBuf[3] != 0xAA || cal_chksum((unsigned short *)recBuf,recLen) )
        {
        	sendBuf[0] = 0xBE;
        	sendBuf[1] = 0x00;
        	sendBuf[2] = 0x06;
		sendBuf[3] = 0xFF;
		checksum = cal_chksum((void *)sendBuf, 4);
		sendBuf[4] = checksum >> 8;
		sendBuf[5] = checksum & 0xFF;
		UART_puts(sendBuf,6);
		UART_disconnect();
        	return 2;	
        }
        else
        {
        	sendBuf[0] = 0xBE;
        	sendBuf[1] = 0x00;
        	sendBuf[2] = 0x06;
		sendBuf[3] = 0x00;
		checksum = cal_chksum((void *)sendBuf, 4);
		sendBuf[4] = checksum >> 8;
		sendBuf[5] = checksum & 0xFF;
		UART_puts(sendBuf,6);
		return 0;	
	}
	*/
}

/*
 * 发送数据
 * 参数 in: sendBuf  要发送的数据区(不包括一位开始位、2位长度位和2位校验位)
 *        : sendLen  要发送的数据区的长度(byte)
 *
 * 返回: 0 发送成功  -1 发送失败
 */
short UART_send(const void *sendBuf, unsigned short sendLen)
{
	typ_msg_word msg_buffer;
        typ_UART_stat_word Ustat;	
	unsigned char pBuf[MAX_BUF_SIZE];
	unsigned char recBuf[MAX_BUF_SIZE];
	unsigned short checksum=0,recLen=0; 
	
	if(sendLen + 5 > MAX_BUF_SIZE)
		return -1;
	
	Ustat.l_word = UART_stat();
	if (!Ustat.bits.UART_on)
		return 1;	
	move_cursor(0,gcCommMsgRow);
	puts("发送数据...");
	if(gcCommMsgRow<6)
		gcCommMsgRow += 2;
	else
		gcCommMsgRow = 2;
	
	pBuf[0] = 0xBE;
	pBuf[1] = (sendLen+5) >> 8;
	pBuf[2] = (sendLen+5) & 0xFF;	
	
	memcpy( (void *)&pBuf[3], sendBuf, sendLen );
	
	checksum = cal_chksum( (unsigned short *)pBuf, sendLen+3);
	pBuf[sendLen+3] = checksum >> 8;
	pBuf[sendLen+4] = checksum & 0xFF;
	
	UART_puts( pBuf, sendLen+5);
	
	SPT_set(64 );	
	//等到确认数据到来
	while(1)
	{
		msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
		if (msg_buffer.bits.comm_data)
			break;
		if (msg_buffer.bits.time_out)
			return 2;
	}
	
        memset( (void*)recBuf,0,sizeof(recBuf) );
	do {
		recBuf[recLen++] = (unsigned char)UART_get_char();
		if( 1 == recLen && recBuf[0] != 0xBE )
			recLen = 0;
		else if ( recLen > 3 && recLen == ( (((unsigned short)recBuf[1])<<8) + recBuf[2] ) )
			break;
		else if (recLen == 6)
			break;
		Ustat.l_word = UART_stat();
        } while (Ustat.bits.buff_data_available);
        
        if ( recLen != 6 || recBuf[0] != 0xBE || recBuf[3] != 0x00 || cal_chksum((unsigned short *)recBuf,recLen) )
        	return 3;
        		
	return 0;
}

/*
 * 接收数据
 * 参数 out: sendBuf  接收到的数据区(包括一位开始位、2位长度位和2位校验位)
 *         : sendLen  接收到的数据区的长度(byte)
 *
 * 返回: 0 接收成功  -1 接收失败
 */
short UART_receive(void *recBuf, unsigned short *recLen)
{
	typ_msg_word msg_buffer;
        typ_UART_stat_word Ustat;
        unsigned char *buf;
	unsigned char sendBuf[6];
        unsigned short checksum,recCount=0;
        short result;
	
//	clr_scr();	
//	move_cursor(0,0);
//	puts("UART_receive");
//	getch();

	Ustat.l_word = UART_stat();
	if (!Ustat.bits.UART_on)
		return 1;	 
 	move_cursor(0,gcCommMsgRow);
	puts("接收数据...");
	if(gcCommMsgRow<6)
		gcCommMsgRow += 2;
	else
		gcCommMsgRow = 2;
	
      
	SPT_set(64);  //time_out = 4s
	buf = (unsigned char *)recBuf;
	//等到数据到来
	while(1)
	{
		msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
		if (msg_buffer.bits.comm_data)
			break;
		if (msg_buffer.bits.time_out)
			return 2;
	}
	
	//接收数据
	do {
		buf[recCount++] = (unsigned char)UART_get_char();
		if(recCount == 1 && buf[0] != 0xBE)//丢弃不是以开始位(0xBE)开始的所有数据
			recCount = 0;
		//接收完了指定帧长,离开循环
		else if ( recCount > 3 && recCount == ( (((unsigned short)buf[1])<<8) + buf[2] ) )
			break;
		else if (recCount >= MAX_BUF_SIZE)
			break;
		Ustat.l_word = UART_stat();
        } while (Ustat.bits.buff_data_available);//否则一直接收到接收缓冲区没有数据
        
        *recLen = recCount;
        
        //判断数据帧的合法性,并且回应对应的数据帧
        checksum = cal_chksum((void *)buf, recCount-2);
    //    Dispbcd(0,0,buf+recCount-2,2);
	sendBuf[0] = checksum >> 8;
	sendBuf[1] = checksum & 0xFF;
    //    Dispbcd(0,6,sendBuf,2);
        if ((recCount < 6) ||(buf[0] != 0xBE)||(buf[recCount-2] != sendBuf[0])||(buf[recCount-1] != sendBuf[1]))
        {
		sendBuf[0] = 0xBE;
		sendBuf[1] = 0x00;
		sendBuf[2] = 0x06;
		sendBuf[3] = 0xFF;//0xFF代表接收出错
		checksum = cal_chksum((void *)sendBuf, 4);
		sendBuf[4] = checksum >> 8;
		sendBuf[5] = checksum & 0xFF;
		UART_puts(sendBuf,6);
		result = 3;
        }
        else
        {
		sendBuf[0] = 0xBE;
		sendBuf[1] = 0x00;
		sendBuf[2] = 0x06;
		sendBuf[3] = 0x00;//0x00代表接收正确
		checksum = cal_chksum((void *)sendBuf, 4);
		sendBuf[4] = checksum >> 8;
		sendBuf[5] = checksum & 0xFF;
		UART_puts(sendBuf,6);
		result = 0;
        }	
        
	return result;
}


/*

main(void)
{
      	typ_msg_word msg_buffer;
      	char icondata[8];
      	char cnt;

      	Disp_icon_customize(0xFF);
      	Disp_init(DISP_INIT_ON);
      	clr_scr();
      	for (cnt = 0; cnt < 8; cnt ++)
		icondata[cnt] = 0;
      	Disp_icon_set((unsigned long *) icondata);

      	Disp_set_font_attribute(DISP_FONT_TYPE_5x7_ENG);
      	goto_xy(20,1);
      	Disp_write_str("hello world");

      	sm_setting(MSK_KEY_UP | MSK_KEY_DOWN);
      	KEY_init(KEY_BEEP_KEY | KEY_AUTO_EL_ON);

      	KEY_beep_mask_set(0xFFFF7FFF);
      	KEY_EL_mask_set(0xFFFF7FFF);

      	EL_set_time_out(5);

      	SPT_set(64);

      	srand(RTC_read_time());
	
	while (1) {
      		char tempStr[40];
		msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);

		if (msg_buffer.bits.time_out) {
	   		Disp_init(DISP_INIT_POWER_SAVE);
		}

		if (msg_buffer.bits.key_available) {
	  		unsigned char tb;
	  		Disp_init(DISP_INIT_ON);
	  		SPT_set(64);

	  		clr_win(0,0*8, 127,63);
	  		goto_xy(0,3);
	  		tb = KEY_read();
	  		Disp_write_str(terminal_key_strings[key_translated(tb)]);
	  		Disp_write_str(" is pressed");
	  		goto_xy(0,5);
	  		memset( (void*)tempStr,0,40);
          		if(tb == KEY_F1 )
          		{
          			char *p;
          			p = (char *)0x00070000;
          			sprintf(tempStr,"send status:%d", UART_send((void*)p,1024) );
          			Disp_write_str(tempStr);
          		}
          		else if(tb == KEY_F2)
          		{         	
          			char *p;
          			p = (char *)0x000f0000;
          			sprintf(tempStr,"send status:%d", UART_send((void*)p,1024) );
          			Disp_write_str(tempStr);
          		}
          		else if(tb == KEY_F3)
          		{
          			char *p;
          			p = (char *)0x000180000;
          			sprintf(tempStr,"send status:%d", UART_send((void*)p,1024) );
          			Disp_write_str(tempStr);
          		}
          		else if(tb == KEY_ENTER)
          		{	
          			sprintf(tempStr,"connect status:%d", UART_connect() );
          			Disp_write_str(tempStr);
          		}
          		else if(tb == KEY_CLR)
          		{
          			UART_disconnect();
          			sprintf(tempStr,"UART disconnect");
          			Disp_write_str(tempStr);
          		}
		}
      	} 
}

*/

⌨️ 快捷键说明

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