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

📄 slip.c

📁 用LPC936实现通过SPI扩展多个串口,在这里实现了对多个通道的管理,C代码,
💻 C
字号:
#include "crc.h"
#include "uart.h"
#include "spi.h"

#define WARNING_FLAG		0x7d
#define DATA_PACKAGE_SIZE	36

unsigned char xdata t_buffer[DATA_PACKAGE_SIZE];
unsigned char t_crc;
bit t_eof=0;
bit t_warning=0;
bit t_on=0;
unsigned char t_idx=0;
unsigned char t_len = 0;

unsigned char xdata r_buffer[DATA_PACKAGE_SIZE];
unsigned char r_crc;
bit r_warning=0;
bit r_on = 0;
unsigned char r_len=0;
unsigned char r_idx=0;

unsigned char slip_index = 0;

void upload_data(void);

void init_slip(void)
{
	t_crc=CRC_INIT;
	t_eof=0;
	t_warning=0;
	t_on=0;
	t_idx=0;
	t_len = 0;

	r_crc=CRC_INIT;
	r_warning=0;
	r_on = 0;
	r_len=0;
	r_idx=0;

	slip_index = 0;
}

void send_data_package(void){
	bit b1,b2;
	char temp = slip_index;

	while(1){
		if(t_on){
			if(!t_eof){
				if(send_char(DATA_EOF_FLAG)){
					t_crc = CRC_INIT;
					t_eof = 1;
				}else return;
			}else{
				if(t_warning){
					if(t_idx < t_len){
						if(send_char(t_buffer[t_idx]^XXXX)){
							t_crc = crc_val(t_crc,t_buffer[t_idx]);					
							t_warning = 0;
						}else return;
					}else{
						if(send_char(t_crc^XXXX)){					
							t_warning = 0;
						}else return;
					}
					t_idx ++;
				}else{
					if(t_idx < t_len){
						switch(t_buffer[t_idx]){
						case DATA_EOF_FLAG:
						case MSG_EOF_FLAG:
						case WARNING_FLAG:
							if(send_char(WARNING_FLAG)){
								t_warning = 1;
							}else return;
						break;
						default:
							if(send_char(t_buffer[t_idx])){
								t_crc = crc_val(t_crc,t_buffer[t_idx]);
								t_idx ++;
							}else return;
						break;
						}
					}else if(t_idx == t_len){
						switch(t_crc){
						case DATA_EOF_FLAG:
						case WARNING_FLAG:
						case MSG_EOF_FLAG:
							if(send_char(WARNING_FLAG)){
								t_warning = 1;
							}else return;
						break;
						default:
							if(send_char(t_crc)){
								t_idx ++;
							}else return;
						break;
						}
					}else{
						if(send_char(DATA_EOF_FLAG)){
							t_eof = 0;
							t_on = 0;
						}else return;
					}
				}
			}
		}else{
			b1 = spi_rx_rx_disable(slip_index);
			if(!b1){
				upload_data();
				b2 = spi_rx_tx_disable(slip_index);
				if(b2){
					if(!order_busy && queue_low(spi_rx_queue[slip_index])){
						order_buffer[0] = slip_index +'0';
						order_buffer[1] = XON;
						order_buffer[7] = 1;
						if(spi_send_msg(order_buffer)) 
							w_spi_rx_tx_disable(slip_index,0);
					}
				}
				if(slip_index == 0) slip_index = 1;
				else slip_index = 0;
				if(slip_index == temp) break;
			}else{slip_index = (slip_index+1)%MAX_NUMBER;break;}			
		}
	}
}

void upload_data(void)
{
	int c;
	t_len = 1;
	t_buffer[0] = '0' + slip_index;
	while(1){
		c = queue_output(&spi_rx_queue[slip_index]);
		if(c == -1) break;
		t_buffer[t_len] = c;
		t_len++;
		if(t_len >= 33) break;			
	}

	if(t_len >= 2){
		t_on = 1;
		t_eof = 0;
		t_warning = 0;
		t_idx = 0;
		t_crc = CRC_INIT;
	}			
}

void rece_data_package(void)
{	
	int c;
	bit b1,b2;

	while(1){
		if(!r_on){
			c = get_char();
			if(c != -1){
				switch(c){
				case WARNING_FLAG:
				r_warning = 1;
				break;
				case DATA_EOF_FLAG:
				if(r_crc == 0 && r_len>2){
					r_on = 1;
					r_len--;
					r_buffer[0]-='0';
					r_idx = 1;
				}else	r_len = 0;
				r_crc = CRC_INIT;
				r_warning = 0;
				break;
				default:
				if(r_warning){
					c = c ^ XXXX;
					r_warning = 0;
				}
				r_crc = crc_val(r_crc,c&0xff);			
				r_buffer[r_len++] = c;
				if(r_len > 33){
					r_len = 0;
					r_crc = CRC_INIT;
					r_warning = 0;
				}
				break;
				}
			}else break;
		}else{
			if(r_buffer[0] >= MAX_NUMBER){
				r_on = 0;
				r_len = 0;
				r_crc = CRC_INIT;
				r_warning = 0;
			}else{
				b2 = spi_exist(r_buffer[0]);
				if(b2){					
					while(r_idx < r_len){
						c = r_buffer[r_idx];
						queue_input(&spi_tx_queue[r_buffer[0]],c);
						if(c != -1) r_idx++;
						else break;
					}
				}else r_idx=r_len;
				
				if(r_idx == r_len){
					r_on = 0;
					r_len = 0;
					r_crc = CRC_INIT;
					r_warning = 0;
				}
				
				b1 = spi_tx_tx_disable(r_buffer[0]);
				if(!b1){
					if(queue_high(spi_tx_queue[r_buffer[0]])){
						if(queue_unused(mtx_queue) > 4){
							send_msg(MSG_EOF_FLAG);
							send_msg(r_buffer[0]+'0');
							send_msg(XOFF);
							send_msg(MSG_EOF_FLAG);
							w_spi_tx_tx_disable(r_buffer[0],1);
						}
					}
				}							
			}
			if(r_on) break;	
		}
	}
}

void slip_scan(void)
{
	rece_data_package();
	send_data_package();
}

⌨️ 快捷键说明

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